('49089','20','walk[1.3.6.1.4.1.674.10892.5.5.1.20.130.1.1.38,1.3.6.1.4.1.674.10892.5.5.1.20.130.1.1.79,1.3.6.1.4.1.674.10892.5.5.1.20.130.1.1.2]','10442','SNMP walk RAID controllers table','dell.server.array.controller.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of RAID Controllers Table `IDRAC-MIB-SMIv2::controllerTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7f08a9bf1d5540f0b05040d16d67d87a','0','2','0'),
('49090','20','walk[1.3.6.1.4.1.674.10892.5.5.1.20.130.15.1.1,1.3.6.1.4.1.674.10892.5.5.1.20.130.15.1.4,1.3.6.1.4.1.674.10892.5.5.1.20.130.15.1.21]','10442','SNMP walk Battery table','dell.server.battery.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of RAID Controllers Table `IDRAC-MIB-SMIv2::batteryTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','39d26209dd3242c5ad90380b566c01aa','0','2','0'),
('49091','20','get[1.3.6.1.4.1.674.10892.5.4.300.50.1.8.1.1]','10442','BIOS version','dell.server.bios.version','1m','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the version name of the system BIOS.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','077c58fdb06c4191bf8f194b4c9108e7','0','2','0'),
('49092','20','walk[1.3.6.1.4.1.674.10892.5.4.1100.30.1.26,1.3.6.1.4.1.674.10892.5.4.1100.32.1.5.1,1.3.6.1.4.1.674.10892.5.4.1100.32.1.6.1]','10442','SNMP walk Processor device tables','dell.server.cpu.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Processor Device Status Table `IDRAC-MIB-SMIv2::processorDeviceTable` and `IDRAC-MIB-SMIv2::processorDeviceStatusTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','94bcc2449dfa4bb59fd778ba96e3abdf','0','2','0'),
('49093','20','walk[1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.1,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.2,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.24,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.31,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.6,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.7,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.35,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.11]','10442','SNMP walk Physical disk table','dell.server.disk.physical.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Physical Disk Table `IDRAC-MIB-SMIv2::physicalDiskTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c888185c08f84b059fdbf7ff0fa8eb6a','0','2','0'),
('49094','20','walk[1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.1,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.2,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.13,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.30,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.11,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.10,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.6,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.4]','10442','SNMP walk Virtual disk table','dell.server.disk.virtual.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Virtual Disk Table `IDRAC-MIB-SMIv2::virtualDiskTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f141e6e279fe4b3db65bbfe7e559389b','0','2','0'),
('49095','20','walk[1.3.6.1.4.1.674.10892.5.4.700.12.1.5,1.3.6.1.4.1.674.10892.5.4.700.12.1.8,1.3.6.1.4.1.674.10892.5.4.700.12.1.7,1.3.6.1.4.1.674.10892.5.4.700.12.1.6]','10442','SNMP walk Cooling device table','dell.server.fan.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Cooling Device Table `IDRAC-MIB-SMIv2::coolingDeviceTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d7e317cd293c4d8fa39f4283b79de6e4','0','2','0'),
('49096','20','get[1.3.6.1.4.1.674.10892.5.2.5.0]','10442','Uptime (hardware)','dell.server.hw.uptime[systemPowerUpTime]','1m','31d','0','0','3','','uptime','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the power-up time of the system in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','afa223e9d16b41deaac482b8328ba0e4','0','2','0'),
('49097','15','','10442','Memory, total size','dell.server.memory.size.total','1m','31d','365d','0','3','','B','','',NULL,NULL,'sum(last_foreach(//dell.server.memory.size[*]))','','0','','','','','0',NULL,'Total memory amount on the device.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c84cc87d95664f66a674eefec258841a','0','2','0'),
('49098','20','walk[1.3.6.1.4.1.674.10892.5.4.1100.50.1.8.1,1.3.6.1.4.1.674.10892.5.4.1100.50.1.5.1,1.3.6.1.4.1.674.10892.5.4.1100.50.1.14.1]','10442','SNMP walk Memory device table','dell.server.memory.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Memory Device Table `IDRAC-MIB-SMIv2::memoryDeviceTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6ad434d7873f4c9e846ebaefa3e3640c','0','2','0'),
('49099','20','walk[1.3.6.1.4.1.674.10892.5.4.1100.90.1.4.1,1.3.6.1.4.1.674.10892.5.4.1100.90.1.30.1,1.3.6.1.4.1.674.10892.5.4.1100.90.1.3.1, 1.3.6.1.4.1.674.10892.5.4.1100.90.1.15.1]','10442','SNMP walk Network device table','dell.server.net.if.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Network Device Table `IDRAC-MIB-SMIv2::networkDeviceTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','73802978c64b4d978b6e06ede9f5d760','0','2','0'),
('49100','20','get[1.3.6.1.6.3.10.2.1.3.0]','10442','Uptime (network)','dell.server.net.uptime[snmpEngineTime]','1m','31d','0','0','3','','uptime','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: SNMP-FRAMEWORK-MIB\r\nThe number of seconds since the value of the snmpEngineBoots object last changed.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','49473f26fedb459c9642704bae33adb1','0','2','0'),
('49101','20','walk[1.3.6.1.4.1.674.10892.5.4.600.12.1.5,1.3.6.1.4.1.674.10892.5.4.600.12.1.8]','10442','SNMP walk Power supply table','dell.server.psu.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Power Supply Table `IDRAC-MIB-SMIv2::powerSupplyTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0b013a35762f4bdab3ffeec58176779a','0','2','0'),
('49102','20','walk[1.3.6.1.4.1.674.10892.5.4.700.20.1.1,1.3.6.1.4.1.674.10892.5.4.700.20.1.8,1.3.6.1.4.1.674.10892.5.4.700.20.1.6,1.3.6.1.4.1.674.10892.5.4.700.20.1.5]','10442','SNMP walk Temperature sensor table','dell.server.sensor.temp.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Temperature Probe Table `IDRAC-MIB-SMIv2::temperatureProbeTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c2ab8a025fb34e878f7bbea9db51dbea','0','2','0'),
('49103','20','walk[1.3.6.1.4.1.674.10892.5.4.600.50.1.7.1,1.3.6.1.4.1.674.10892.5.4.600.50.1.5.1]','10442','SNMP walk System battery table','dell.server.system.battery.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of System Battery Table `IDRAC-MIB-SMIv2::systemBatteryTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f1068ce5a40b45ba9388e17f6dce3b79','0','2','0'),
('49104','20','walk[1.3.6.1.4.1.674.10892.5.4.600.20.1.8.1,1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1,1.3.6.1.4.1.674.10892.5.4.600.20.1.5.1,1.3.6.1.4.1.674.10892.5.4.600.20.1.7.1]','10442','SNMP walk Voltage probe table','dell.server.voltage.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Voltage Probe Table `IDRAC-MIB-SMIv2::voltageProbeTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b5c04f5439244a87991b2b053b5f8f9b','0','2','0'),
('49125','20','walk[1.3.6.1.4.1.674.10892.5.5.1.20.130.1.1.38,1.3.6.1.4.1.674.10892.5.5.1.20.130.1.1.79,1.3.6.1.4.1.674.10892.5.5.1.20.130.1.1.2]','10255','SNMP walk RAID controllers table','dell.server.array.controller.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of RAID Controllers Table `IDRAC-MIB-SMIv2::controllerTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3d6ef68b4a914089ab4356ab33a3f3d7','0','2','0'),
('49126','20','walk[1.3.6.1.4.1.674.10892.5.5.1.20.130.15.1.1,1.3.6.1.4.1.674.10892.5.5.1.20.130.15.1.4,1.3.6.1.4.1.674.10892.5.5.1.20.130.15.1.21]','10255','SNMP walk Battery table','dell.server.battery.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of RAID Controllers Table `IDRAC-MIB-SMIv2::batteryTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d1e52200ed744019b87a91d25beef034','0','2','0'),
('49127','20','get[1.3.6.1.4.1.674.10892.5.4.300.50.1.8.1.1]','10255','BIOS version','dell.server.bios.version','1m','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the version name of the system BIOS.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1c9a75cfdbf94f3a8a4fdbef2914506c','0','2','0'),
('49128','20','get[1.3.6.1.2.1.1.4.0]','10255','System contact details','dell.server.contact[sysContact]','1h','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: SNMPv2-MIB\r\nName and contact information of the contact person for the node. If not provided, the value is a zero-length string.','23','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d0b46eadaeb04edbb9cfc27637397c91','0','2','0'),
('49129','20','walk[1.3.6.1.4.1.674.10892.5.4.1100.30.1.26,1.3.6.1.4.1.674.10892.5.4.1100.32.1.5.1,1.3.6.1.4.1.674.10892.5.4.1100.32.1.6.1]','10255','SNMP walk Processor device tables','dell.server.cpu.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Processor Device Status Table `IDRAC-MIB-SMIv2::processorDeviceTable` and `IDRAC-MIB-SMIv2::processorDeviceStatusTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3adaaa4482b24de29aa4f2fdf8bd46ca','0','2','0'),
('49130','20','get[1.3.6.1.2.1.1.1.0]','10255','System description','dell.server.descr[sysDescr]','1h','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: SNMPv2-MIB\r\nA textual description of the entity. This value should include the full name and version identification of the system\'s hardware type, software operating system, and networking software.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9ef776ba14ab4eb7aed993711832cf4e','0','2','0'),
('49131','20','walk[1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.1,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.2,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.24,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.31,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.6,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.7,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.35,1.3.6.1.4.1.674.10892.5.5.1.20.130.4.1.11]','10255','SNMP walk Physical disk table','dell.server.disk.physical.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Physical Disk Table `IDRAC-MIB-SMIv2::physicalDiskTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c005a65a9d3447d981260c6410546954','0','2','0'),
('49132','20','walk[1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.1,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.2,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.13,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.30,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.11,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.10,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.6,1.3.6.1.4.1.674.10892.5.5.1.20.140.1.1.4]','10255','SNMP walk Virtual disk table','dell.server.disk.virtual.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Virtual Disk Table `IDRAC-MIB-SMIv2::virtualDiskTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','719c2e0c5b664180af1af80125c588aa','0','2','0'),
('49133','20','walk[1.3.6.1.4.1.674.10892.5.4.700.12.1.5,1.3.6.1.4.1.674.10892.5.4.700.12.1.8,1.3.6.1.4.1.674.10892.5.4.700.12.1.7,1.3.6.1.4.1.674.10892.5.4.700.12.1.6]','10255','SNMP walk Cooling device table','dell.server.fan.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Cooling Device Table `IDRAC-MIB-SMIv2::coolingDeviceTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8687491307cd4aae8882781a223169c0','0','2','0'),
('49134','20','get[1.3.6.1.4.1.674.10892.5.1.1.8.0]','10255','Firmware version','dell.server.hw.firmware[racFirmwareVersion]','1h','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the firmware version of a remote access card.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ea7ba9945a13407d9d9cba8b34ec480f','0','2','0'),
('49135','20','get[1.3.6.1.4.1.674.10892.5.1.3.12.0]','10255','Hardware model name','dell.server.hw.model[systemModelName]','1m','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the model name of the system.','29','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7cd756be916e4173a653ea424d8d5232','0','2','0'),
('49136','20','get[1.3.6.1.4.1.674.10892.5.1.3.2.0]','10255','Hardware serial number','dell.server.hw.serialnumber[systemServiceTag]','1m','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the service tag of the system.','8','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d0b2ed5ce8e84a06ad1081ade25da16a','0','2','0'),
('49137','20','get[1.3.6.1.4.1.674.10892.5.2.5.0]','10255','Uptime (hardware)','dell.server.hw.uptime[systemPowerUpTime]','1m','31d','0','0','3','','uptime','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the power-up time of the system in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','78cf22c146e4432594d844c592c25d76','0','2','0'),
('49138','20','get[1.3.6.1.2.1.1.6.0]','10255','System location','dell.server.location[sysLocation]','15m','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: SNMPv2-MIB\r\nThe physical location of this node (e.g., \'telephone closet, 3rd floor\'). If the location is unknown, the value is a zero-length string.','24','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','97044f584e954ae9b3d57abf0ced73eb','0','2','0'),
('49139','15','','10255','Memory, total size','dell.server.memory.size.total','1m','31d','365d','0','3','','B','','',NULL,NULL,'sum(last_foreach(//dell.server.memory.size[*]))','','0','','','','','0',NULL,'Total memory amount on the device.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','94191a9ec1584435974cb3c8e2d65f99','0','2','0'),
('49140','20','walk[1.3.6.1.4.1.674.10892.5.4.1100.50.1.8.1,1.3.6.1.4.1.674.10892.5.4.1100.50.1.5.1,1.3.6.1.4.1.674.10892.5.4.1100.50.1.14.1]','10255','SNMP walk Memory device table','dell.server.memory.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Memory Device Table `IDRAC-MIB-SMIv2::memoryDeviceTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7ead89af65ce480593edef80919ac1d5','0','2','0'),
('49141','20','get[1.3.6.1.2.1.1.5.0]','10255','System name','dell.server.name[sysName]','15m','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: SNMPv2-MIB\r\nAn administratively-assigned name for this managed node. By convention, this is the node\'s fully-qualified domain name. If the name is unknown, the value is a zero-length string.','3','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9032ffe4b0314a47a2f3241b38156592','0','2','0'),
('49142','20','walk[1.3.6.1.4.1.674.10892.5.4.1100.90.1.4.1,1.3.6.1.4.1.674.10892.5.4.1100.90.1.30.1,1.3.6.1.4.1.674.10892.5.4.1100.90.1.3.1, 1.3.6.1.4.1.674.10892.5.4.1100.90.1.15.1]','10255','SNMP walk Network device table','dell.server.net.if.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Network Device Table `IDRAC-MIB-SMIv2::networkDeviceTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4b7969bd9b1441d7b7ddabaa786a31b7','0','2','0'),
('49143','20','get[1.3.6.1.6.3.10.2.1.3.0]','10255','Uptime (network)','dell.server.net.uptime[snmpEngineTime]','1m','31d','0','0','3','','uptime','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: SNMP-FRAMEWORK-MIB\r\nThe number of seconds since the value of the snmpEngineBoots object last changed.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','11d66130f1d04acfb439ef65dec31ea4','0','2','0'),
('49144','20','get[1.3.6.1.2.1.1.2.0]','10255','System object ID','dell.server.objectid[sysObjectID]','15m','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: SNMPv2-MIB\r\nThe vendor\'s authoritative identification of the entity as part of the vendor\'s SMI enterprises subtree with the prefix 1.3.6.1.4.1 (e.g., a vendor with the identifier 1.3.6.1.4.1.4242 might assign a system object with the OID 1.3.6.1.4.1.4242.1.1).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3930a7fa88de48beac130cedfe8dc0f7','0','2','0'),
('49145','20','walk[1.3.6.1.4.1.674.10892.5.4.600.12.1.5,1.3.6.1.4.1.674.10892.5.4.600.12.1.8]','10255','SNMP walk Power supply table','dell.server.psu.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Power Supply Table `IDRAC-MIB-SMIv2::powerSupplyTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9a76516aba9543348b160d366a0f7f80','0','2','0'),
('49146','20','walk[1.3.6.1.4.1.674.10892.5.4.700.20.1.1,1.3.6.1.4.1.674.10892.5.4.700.20.1.8,1.3.6.1.4.1.674.10892.5.4.700.20.1.6,1.3.6.1.4.1.674.10892.5.4.700.20.1.5]','10255','SNMP walk Temperature sensor table','dell.server.sensor.temp.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Temperature Probe Table `IDRAC-MIB-SMIv2::temperatureProbeTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','34707e1be349441aa74cb91926d4b5d6','0','2','0'),
('49147','20','get[1.3.6.1.4.1.674.10892.5.2.1.0]','10255','Overall system health status','dell.server.status[globalSystemStatus]','1m','31d','0','0','3','','','','',NULL,'107','','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the overall rollup status of all the components in the system monitored by the remote access card. Includes system, storage, IO devices, iDRAC, CPU, memory, etc.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6164d49ba01c4fe895bed48ee3489edc','0','2','0'),
('49148','20','get[1.3.6.1.4.1.674.10892.5.1.3.6.0]','10255','Operating system','dell.server.sw.os[systemOSName]','1h','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: IDRAC-MIB-SMIv2\r\nThis attribute defines the name of the operating system that the host is running.','5','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3c93c8909ad14324947beda64c02f386','0','2','0'),
('49149','20','walk[1.3.6.1.4.1.674.10892.5.4.600.50.1.7.1,1.3.6.1.4.1.674.10892.5.4.600.50.1.5.1]','10255','SNMP walk System battery table','dell.server.system.battery.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of System Battery Table `IDRAC-MIB-SMIv2::systemBatteryTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7edbcc5d45a44fbaaafcc7417d7ff26b','0','2','0'),
('49150','20','walk[1.3.6.1.4.1.674.10892.5.4.600.20.1.8.1,1.3.6.1.4.1.674.10892.5.4.600.20.1.6.1,1.3.6.1.4.1.674.10892.5.4.600.20.1.5.1,1.3.6.1.4.1.674.10892.5.4.600.20.1.7.1]','10255','SNMP walk Voltage probe table','dell.server.voltage.walk','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'Scanning of Voltage Probe Table `IDRAC-MIB-SMIv2::voltageProbeTable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1cd3315e2739438ba245345057112a0e','0','2','0'),
('49188','5','','10048','Zabbix proxy check','zabbix[triggers]','1m','31d','0','0','3','','','','',NULL,'1371','','','0','','','','','0',NULL,'Flag indicating whether it is a proxy or not.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7a5c163672d1422aa663c2606d1166e5','0','2','0'),
('49189','0','','10660','Queue over 10 minutes','zabbix.stats[{$ZABBIX.PROXY.ADDRESS},{$ZABBIX.PROXY.PORT},queue,10m]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The number of monitored items in the queue that are delayed by at least 10 minutes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d4da5073f23d47c1adc55b30117bb1e0','0','2','0'),
('49190','0','','10660','Queue','zabbix.stats[{$ZABBIX.PROXY.ADDRESS},{$ZABBIX.PROXY.PORT},queue]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The number of monitored items in the queue that are delayed by at least 6 seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b05149cb78b44bc08ccd72b58a34aded','0','2','0'),
('49191','0','','10660','Zabbix stats','zabbix.stats[{$ZABBIX.PROXY.ADDRESS},{$ZABBIX.PROXY.PORT}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The master item of Zabbix proxy statistics.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','32495fbb4c6642378a5871323b11cb08','0','2','0'),
('49192','7','','10661','Queue over 10 minutes','zabbix.stats[{$ZABBIX.PROXY.ADDRESS},{$ZABBIX.PROXY.PORT},queue,10m]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The number of monitored items in the queue that are delayed by at least 10 minutes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','38016356b0c2422baeaaf83add1c07dd','0','2','0'),
('49193','7','','10661','Queue','zabbix.stats[{$ZABBIX.PROXY.ADDRESS},{$ZABBIX.PROXY.PORT},queue]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The number of monitored items in the queue that are delayed by at least 6 seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','35c77ed090df4bb58f29a50db9584325','0','2','0'),
('49194','7','','10661','Zabbix stats','zabbix.stats[{$ZABBIX.PROXY.ADDRESS},{$ZABBIX.PROXY.PORT}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The master item of Zabbix proxy statistics.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ca89ec32d7ac45aba86a319cdb4f3b0d','0','2','0'),
('49290','5','','10047','Zabbix server check','zabbix[triggers]','1m','31d','0','0','3','','','','',NULL,'1377','','','0','','','','','0',NULL,'Flag indicating whether it is a server or not.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9a2d6f239ea642b9b231801db68638b5','0','2','0'),
('49291','0','','10662','Queue over 10 minutes','zabbix.stats[{$ZABBIX.SERVER.ADDRESS},{$ZABBIX.SERVER.PORT},queue,10m]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The number of monitored items in the queue that are delayed by at least 10 minutes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f3871d3395204212bffd236d80d208f7','0','2','0'),
('49292','0','','10662','Queue','zabbix.stats[{$ZABBIX.SERVER.ADDRESS},{$ZABBIX.SERVER.PORT},queue]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The number of monitored items in the queue that are delayed by at least 6 seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','e03e82b05bb140e7ae52be6d1d1ef869','0','2','0'),
('49293','0','','10662','Zabbix stats','zabbix.stats[{$ZABBIX.SERVER.ADDRESS},{$ZABBIX.SERVER.PORT}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The master item of Zabbix server statistics.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7084c5c4b6cd4bf6a0b2ab23f171e5de','0','2','0'),
('49294','7','','10663','Queue over 10 minutes','zabbix.stats[{$ZABBIX.SERVER.ADDRESS},{$ZABBIX.SERVER.PORT},queue,10m]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The number of monitored items in the queue that are delayed by at least 10 minutes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','99be4e08ef924b49a3237bc4970e61c2','0','2','0'),
('49295','7','','10663','Queue','zabbix.stats[{$ZABBIX.SERVER.ADDRESS},{$ZABBIX.SERVER.PORT},queue]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The number of monitored items in the queue that are delayed by at least 6 seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ef3a71dd5daf4c8cbfa75ed66ef7dee7','0','2','0'),
('49296','7','','10663','Zabbix stats','zabbix.stats[{$ZABBIX.SERVER.ADDRESS},{$ZABBIX.SERVER.PORT}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The master item of Zabbix server statistics.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6bc7fdba3ff846cb87f916b05e303572','0','2','0'),
('49475','21','','10664','Get data','azure.db.mssql.data.get','1m','0','0','0','4','','','','',NULL,NULL,'var Azure = {\r\n	params: {},\r\n	token: null,\r\n\r\n	setParams: function (params) {\r\n		[\'app_id\', \'password\', \'tenant_id\', \'subscription_id\', \'resource_id\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: \' + field + \'.\';\r\n			}\r\n		});\r\n\r\n		Azure.params = params;\r\n	},\r\n\r\n	login: function () {\r\n		var response, login = new HttpRequest();\r\n\r\n		if (typeof Azure.params.proxy !== \'undefined\' && Azure.params.proxy !== \'\') {\r\n			login.setProxy(Azure.params.proxy);\r\n		}\r\n\r\n		login.addHeader(\'Content-Type: application/x-www-form-urlencoded\');\r\n		response = login.post(\r\n			\'https://login.microsoftonline.com/\' + encodeURIComponent(Azure.params.tenant_id) + \'/oauth2/token\',\r\n			\'grant_type=client_credentials&resource=\' + encodeURIComponent(\'https://management.azure.com/\') + \'&client_id=\' + encodeURIComponent(Azure.params.app_id) + \'&client_secret=\' + encodeURIComponent(Azure.params.password)\r\n		);\r\n\r\n		if (login.getStatus() !== 200) {\r\n			throw \'Login failed with status code \' + login.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse login session response.\';\r\n		}\r\n\r\n		if (!response.hasOwnProperty(\'access_token\')) {\r\n			throw \'Authentication response does not contain access token.\';\r\n		}\r\n\r\n		Azure.token = response[\'access_token\'];\r\n	},\r\n\r\n	request: function (url) {\r\n		var response, request = new HttpRequest();\r\n\r\n		if (typeof Azure.params.proxy !== \'undefined\' && Azure.params.proxy !== \'\') {\r\n			request.setProxy(Azure.params.proxy);\r\n		}\r\n\r\n		if (!Azure.token) {\r\n			throw \'Request does not contain access token.\';\r\n		}\r\n\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Authorization: Bearer \' + Azure.token);\r\n		Zabbix.log(4, \'[ Azure DTU DB ] request url: \' + url);\r\n\r\n		response = request.get(url);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			return JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from API.\';\r\n		}\r\n	},\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var data = {},\r\n			metric_endpoints = {\r\n				\'metrics_main\': \'/providers/Microsoft.Insights/metrics?metricnames=\' + encodeURIComponent(\'allocated_data_storage,availability,blocked_by_firewall,connection_failed,connection_successful,cpu_percent,deadlock,dtu_consumption_percent,dtu_limit,dtu_used,log_write_percent,physical_data_read_percent,sessions_count,sessions_percent,sql_instance_cpu_percent,sql_instance_memory_percent,storage,storage_percent\') + \'&api-version=2021-05-01&timespan=PT5M\',\r\n				\'metrics_secondary\': \'/providers/Microsoft.Insights/metrics?metricnames=\' + encodeURIComponent(\'tempdb_data_size,tempdb_log_size,tempdb_log_used_percent,workers_percent,xtp_storage_percent\') + \'&api-version=2021-05-01&timespan=PT5M\',\r\n			};\r\n\r\n		data.metrics = {};\r\n\r\n		Object.keys(metric_endpoints).forEach(function (field) {\r\n			metrics = Azure.getField(Azure.request(\'https://management.azure.com\' + Azure.params.resource_id + metric_endpoints[field]), \'value\');\r\n\r\n			for (k in metrics) {\r\n				key = Azure.getField(metrics[k], \'name.value\').replace(/(\\s|\\/)+/g, \'\');\r\n\r\n				if (metrics[k].timeseries.length === 0) {\r\n					metrics[k].timeseries.push({ \'data\': [\'nodata\'] })\r\n				}\r\n\r\n				values = Azure.getField(metrics[k], \'timeseries.0.data\');\r\n\r\n				for (var i = values.length - 1; i >= 0; i--) {\r\n\r\n					dataseriesKeys = Object.keys(values[i]);\r\n					aggregation = dataseriesKeys[1];\r\n\r\n					if (typeof (values[i][aggregation]) !== \'undefined\') {\r\n						data.metrics[key] = values[i];\r\n						break;\r\n					}\r\n				}\r\n			}\r\n		});\r\n\r\n		data.health = Azure.getField(Azure.request(\'https://management.azure.com\' + Azure.params.resource_id + \'/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01\'), \'value.0.properties\');\r\n\r\n		return data\r\n	}\r\n};\r\n\r\ntry {\r\n	Azure.setParams(JSON.parse(value));\r\n	Azure.login();\r\n	return JSON.stringify(Azure.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ Azure DTU DB ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','0',NULL,'The result of API requests is expressed in JSON format.','0','7d','0','',NULL,'{$AZURE.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','4349f68c08a548d19d9ce58e66557ce5','0','2','0'),
('49724','20','get[1.3.6.1.4.1.10002.1.1.1.4.2.1.3.1]','10237','Load average (1m avg)','system.cpu.load.avg1[loadValue.1]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: FROGFOOT-RESOURCES-MIB\r\n1 minute load average of processor load.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3e092597f217443498eeb8a409f814e4','0','2','0'),
('49725','20','get[1.3.6.1.4.1.10002.1.1.1.4.2.1.3.3]','10237','Load average (15m avg)','system.cpu.load.avg15[loadValue.3]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','0',NULL,'MIB: FROGFOOT-RESOURCES-MIB\r\n15 minute load average of processor load.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','e0911150058e43f4b0f26df2d00e57c7','0','2','0'),
('49726','21','','10665','Authentication','purestorage.flasharray.auth','1m','0','0','0','4','','','','',NULL,NULL,'var params = JSON.parse(value),\r\n	request = new HttpRequest(),\r\n	cookies = [],\r\n	error_msg = \'\';\r\n\r\nfunction getToken(url, data) {\r\n	var token = null;\r\n	var response = request.post(url, JSON.stringify(data));\r\n	Zabbix.log(4, \'[ Pure Storage API ] [ \' + url + \' ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n	if (request.getStatus() !== 200) {\r\n		throw \'Failed to receive data: invalid response status code.\';\r\n	}\r\n\r\n	if (response !== null) {\r\n		try {\r\n			token = JSON.parse(response).api_token;\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to get the API token from Pure Storage API. Check debug log for more information.\';\r\n		}\r\n	}\r\n\r\n	if (token === null || typeof token !== \'string\') {\r\n		throw \'Something went wrong while getting the API token. Check debug log for more information.\';\r\n	}\r\n\r\n	return token;\r\n};\r\n\r\nfunction createSession(url, data) {\r\n	var cookies = [];\r\n	response = request.post(url, JSON.stringify(data));\r\n	Zabbix.log(4, \'[ Pure Storage API ] [ \' + url + \' ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n	if (request.getStatus() !== 200) {\r\n		throw \'Failed to receive data: invalid response status code.\';\r\n	}\r\n\r\n	if (response !== null) {\r\n		try {\r\n			username = JSON.parse(response).username;\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from Pure Storage API. Check debug log for more information.\';\r\n		}\r\n	} else {\r\n		throw \'Authentication failed.\';\r\n	}\r\n\r\n	var headers = request.getHeaders();\r\n	for (key in headers) {\r\n		if (key.toLowerCase() == \'set-cookie\') {\r\n			var entries = headers[key].split(\',\');\r\n			for (idx in entries) {\r\n				var value = entries[idx].split(\';\')[0];\r\n				cookies.push(value);\r\n			}\r\n		}\r\n	}\r\n\r\n	return cookies;\r\n};\r\n\r\ntry {\r\n\r\n	[\'url\', \'token\', \'username\', \'password\', \'version\'].forEach(function (field) {\r\n		var macro = \'{$PURE.FLASHARRAY.API.\' + field.toUpperCase() + \'}\';\r\n		if (typeof params[field] === \'undefined\' || params[field] === macro) {\r\n			throw \'Please set \\\'\' + field + \'\\\' script input parameter to the proper \' + macro + \' macro value.\';\r\n		}\r\n	});\r\n	[\'url\', \'version\'].forEach(function (field) {\r\n		if (typeof params[field] == \'\') {\r\n			throw \'Please set \\\'\' + field + \'\\\' script input parameter to the proper value.\';\r\n		}\r\n	});\r\n\r\n	if (params.token == \'\' & params.username == \'\' & params.password == \'\') {\r\n		throw \'To perform authentication, either a token or a username and password must be specified.\';\r\n	}\r\n\r\n	if (params.url.indexOf(\'http://\') === -1 && params.url.indexOf(\'https://\') === -1) {\r\n		params.url = \'https://\' + params.url + (!params.url.endsWith(\'/\') ? \'/\' : \'\');;\r\n	}\r\n\r\n	if (typeof params.http_proxy !== \'undefined\' && params.http_proxy !== \'{\' + \'$PURE.FLASHARRAY.HTTP_PROXY}\' && params.http_proxy !== \'\') {\r\n		request.setProxy(params.http_proxy);\r\n	}\r\n\r\n	request.addHeader(\'Accept: application/json\');\r\n	request.addHeader(\'Content-Type: application/json\');\r\n	if (params.token === \'\') {\r\n		if (params.username === \'\' || params.password === \'\') {\r\n			throw \'Username or password is not specified.\';\r\n		}\r\n		params.token = getToken(\r\n			params.url + \'api/\' + params.version + \'/auth/apitoken\',\r\n			{\'username\': params.username,\'password\': params.password}\r\n		);\r\n	}\r\n	cookies = createSession(\r\n		params.url + \'api/\' + params.version + \'/auth/session\',\r\n		{\'api_token\': params.token}\r\n	);\r\n\r\n} catch (err) {\r\n	error_msg = err;\r\n};\r\n\r\nreturn JSON.stringify({\r\n	\'cookie\': cookies.join(\'; \'),\r\n	\'error\': error_msg.toString()\r\n});','','0','','','','','0',NULL,'Pure Storage FlashArray authentication with username and password or API token usage.\r\nReturns a session ID that is required only once and is used for all dependent script items.\r\nA session will expire after 30 minutes. Check the template documentation for details.','0','7d','0','',NULL,'{$PURE.FLASHARRAY.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','37b7fc4e8af740639a009049acdaf229','0','2','0'),
('49727','21','','10666','Authentication','purestorage.flasharray.auth','1m','0','0','0','4','','','','',NULL,NULL,'var params = JSON.parse(value),\r\n	request = new HttpRequest(),\r\n	token = \'\',\r\n	error_msg = \'\';\r\n\r\nfunction login(url) {\r\n	var token = \'\';\r\n	response = request.post(url);\r\n	Zabbix.log(4, \'[ Pure Storage API ] [ \' + url + \' ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n	if (request.getStatus() !== 200) {\r\n		throw \'Failed to receive data: invalid response status code.\';\r\n	}\r\n\r\n	if (response !== null) {\r\n		try {\r\n			username = JSON.parse(response).username;\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from Pure Storage API. Check debug log for more information.\';\r\n		}\r\n	} else {\r\n		throw \'Authentication failed.\';\r\n	}\r\n\r\n	var headers = request.getHeaders();\r\n	for (key in headers) {\r\n		if (key.toLowerCase() == \'x-auth-token\') {\r\n			token = headers[key];\r\n		}\r\n	}\r\n\r\n	return token;\r\n};\r\n\r\ntry {\r\n\r\n	[\'url\', \'token\', \'version\'].forEach(function (field) {\r\n		var macro = \'{$PURE.FLASHARRAY.API.\' + field.toUpperCase() + \'}\';\r\n		if (typeof params[field] === \'undefined\' || params[field] === macro) {\r\n			throw \'Please set \\\'\' + field + \'\\\' script input parameter to the proper \' + macro + \' macro value.\';\r\n		}\r\n	});\r\n	[\'url\', \'version\'].forEach(function (field) {\r\n		if (typeof params[field] == \'\') {\r\n			throw \'Please set \\\'\' + field + \'\\\' script input parameter to the proper value.\';\r\n		}\r\n	});\r\n\r\n	if (params.url.indexOf(\'http://\') === -1 && params.url.indexOf(\'https://\') === -1) {\r\n		params.url = \'https://\' + params.url + (!params.url.endsWith(\'/\') ? \'/\' : \'\');;\r\n	}\r\n\r\n	if (typeof params.http_proxy !== \'undefined\' && params.http_proxy !== \'{\' + \'$PURE.FLASHARRAY.HTTP_PROXY}\' && params.http_proxy !== \'\') {\r\n		request.setProxy(params.http_proxy);\r\n	}\r\n\r\n	request.addHeader(\'Accept: application/json\');\r\n	request.addHeader(\'Content-Type: application/json\');\r\n	request.addHeader(\'api-token: \' + params.token);\r\n	token = login(\r\n		params.url + \'api/\' + params.version + \'/login\'\r\n	);\r\n\r\n} catch (err) {\r\n	error_msg = err;\r\n};\r\n\r\nreturn JSON.stringify({\r\n	\'token\': token,\r\n	\'error\': error_msg.toString()\r\n});','','0','','','','','0',NULL,'Pure Storage FlashArray authentication with API token usage.\r\nReturns a session token; it is required only once and is used for all dependent script items.\r\nA session will expire after 30 minutes. Check the template documentation for the details.','0','7d','0','',NULL,'{$PURE.FLASHARRAY.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','bf9a63ef87674ff4a3ec07f7637435cb','0','2','0'),
('49953','11','','10589','Version (numeric)','db.odbc.select[pgsql.version.num,,"Database={$PG.DATABASE};{$PG.CONNSTRING.ODBC}"]','15m','31d','0','0','3','','','','',NULL,NULL,'SELECT current_setting(\'server_version_num\')','','0','{$PG.USER}','{$PG.PASSWORD}','','','0',NULL,'Reports the version number of the server as an integer.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0b76450dd17d47a1829f51960dcb1374','0','2','0'),
('49977','3','','10667','NETCONF: Service response time','net.tcp.service.perf[ssh,"{$JUNIPER.MX.NETCONF.IP}","{$JUNIPER.MX.NETCONF.PORT}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','0',NULL,'Checks the performance of a TCP service.\r\nPossible values: a float representing the response time in seconds, or `0.000000` indicating the service is down.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a5f2e862b7d04ebea583840735ca359b','0','2','0'),
('49978','3','','10667','NETCONF: Service status','net.tcp.service[ssh,"{$JUNIPER.MX.NETCONF.IP}","{$JUNIPER.MX.NETCONF.PORT}"]','1m','31d','365d','0','3','','','','',NULL,'1416','','','0','','','','','0',NULL,'Checks if a service is running and accepting NETCONF connections.\r\nPossible values: 0 - the service is down; 1 - the service is running.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ce22a1eda3874f8c9df95f932b918d5f','0','2','0'),
('49979','13','','10667','Routing protocols: Get data','ssh.run[JuniperMxBgpOspf,{$JUNIPER.MX.NETCONF.IP},{$JUNIPER.MX.NETCONF.PORT},,,netconf]','0;s15','0','0','0','4','','','','',NULL,NULL,'<rpc>\r\n    <get-bgp-summary-information>\r\n            <logical-system>all</logical-system>\r\n    </get-bgp-summary-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-ospf-neighbor-information>\r\n        <logical-system>all</logical-system>\r\n        <detail/>\r\n    </get-ospf-neighbor-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-ospf3-neighbor-information>\r\n        <logical-system>all</logical-system>\r\n        <detail/>\r\n    </get-ospf3-neighbor-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <close-session/>\r\n</rpc>\r\n]]>]]>','','0','{$JUNIPER.MX.NETCONF.USERNAME}','{$JUNIPER.MX.NETCONF.PASSWORD}','','','0',NULL,'Gets routing protocol information data using the RPC request NETCONF server.','0','7d','0','',NULL,'{$JUNIPER.MX.NETCONF.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','bf26f0a8e3e7481692c4150217a3802b','0','2','0'),
('49980','13','','10667','DOM: Get data','ssh.run[JuniperMxDom,{$JUNIPER.MX.NETCONF.IP},{$JUNIPER.MX.NETCONF.PORT},,,netconf]','0;s30','0','0','0','4','','','','',NULL,NULL,'<rpc>\r\n    <get-interface-optics-diagnostics-information>\r\n    </get-interface-optics-diagnostics-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <close-session/>\r\n</rpc>\r\n]]>]]>','','0','{$JUNIPER.MX.NETCONF.USERNAME}','{$JUNIPER.MX.NETCONF.PASSWORD}','','','0',NULL,'Gets interface optics diagnostics information using the RPC request NETCONF server.','0','7d','0','',NULL,'{$JUNIPER.MX.NETCONF.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','b08e9571da564af3bfcefcde64221d1f','0','2','0'),
('49981','13','','10667','Interface information: Get data','ssh.run[JuniperMxInterface,{$JUNIPER.MX.NETCONF.IP},{$JUNIPER.MX.NETCONF.PORT},,,netconf]','0;s00','0','0','0','4','','','','',NULL,NULL,'<rpc>\r\n    <get-interface-information>\r\n            <statistics/>\r\n            <detail/>\r\n    </get-interface-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <close-session/>\r\n</rpc>\r\n]]>]]>','','0','{$JUNIPER.MX.NETCONF.USERNAME}','{$JUNIPER.MX.NETCONF.PASSWORD}','','','0',NULL,'Gets interface information using the RPC request NETCONF server.','0','7d','0','',NULL,'{$JUNIPER.MX.NETCONF.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','5087b2674f6f42128e865119aac94a64','0','2','0'),
('49982','13','','10667','Resource: Get data','ssh.run[JuniperMxResource,{$JUNIPER.MX.NETCONF.IP},{$JUNIPER.MX.NETCONF.PORT},,,netconf]','0;s45','0','0','0','4','','','','',NULL,NULL,'<rpc>\r\n    <get-fpc-information>\r\n    </get-fpc-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-fpc-information>\r\n            <detail/>\r\n    </get-fpc-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-route-engine-information>\r\n    </get-route-engine-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-alarm-information>\r\n    </get-alarm-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-system-storage>\r\n    </get-system-storage>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-environment-information>\r\n    </get-environment-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-environment-pem-information>\r\n    </get-environment-pem-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <get-fan-information>\r\n    </get-fan-information>\r\n</rpc>\r\n]]>]]>\r\n<rpc>\r\n    <close-session/>\r\n</rpc>\r\n]]>]]>','','0','{$JUNIPER.MX.NETCONF.USERNAME}','{$JUNIPER.MX.NETCONF.PASSWORD}','','','0',NULL,'Gets resource information data using the RPC request NETCONF server.','0','7d','0','',NULL,'{$JUNIPER.MX.NETCONF.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','b6f6235bfc6a42238cf6e03ebf43d00d','0','2','0'),
('50224','21','','10413','Get data','cert.get.data','1m','1h','0','0','4','','','','',NULL,NULL,'var Cert = {\r\n	params: {},\r\n\r\n	checkParams: function (params) {\r\n		if (typeof params !== \'object\') {\r\n			throw \'Error of parameter processing.\'\r\n		}\r\n\r\n		[\'hostnames\'].forEach(function (field) {\r\n			if (typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required params is not set:\' + field + \'.\';\r\n			}\r\n		});\r\n\r\n		[\'port\', \'ip\', \'check\'].forEach(function (field) {\r\n			if (typeof params[field] === \'undefined\') {\r\n				params[field] = \'\';\r\n			}\r\n		});\r\n\r\n		Cert.params = params;\r\n	},\r\n\r\n	parseParams: function () {\r\n		var array_hostname = Cert.params[\'hostnames\'].split(\',\'),\r\n			array_port = Cert.params[\'port\'].split(\',\'),\r\n			array_ip = Cert.params[\'ip\'].split(\',\'),\r\n			data = [],\r\n			errors = [];\r\n\r\n		for (var i = 0; i < Math.max(array_hostname.length, array_port.length, array_ip.length); i++) {\r\n			if (typeof array_hostname[i] === \'undefined\' || array_hostname[i].trim() === \'\') {\r\n				if (Cert.params[\'check\'] === \'STRICT\') {\r\n					throw \'Invalid parameter "{\' + \'$CERT.WEBSITE.HOSTNAME} [\' + i + \']" : host is required.\'\r\n				} else {\r\n					errors.push(i);\r\n					continue;\r\n				}\r\n			}\r\n\r\n			item_name = array_hostname[i].trim();\r\n			ip = typeof array_ip[i] === \'undefined\' ? \'\' : array_ip[i].trim();\r\n			port = typeof array_port[i] === \'undefined\' ? \'\' : array_port[i].trim();\r\n\r\n			is_empty_ip = ip === \'\';\r\n			is_empty_port = port === \'\' || port === \'443\';\r\n\r\n			if (!is_empty_port) {\r\n\r\n				if (!/^\\d+$/.test(port)) {\r\n					throw \'Invalid parameter "{\' + \'$CERT.WEBSITE.PORT} [\' + i + \']" : error parse value "\' + port + \'".\';\r\n				}\r\n\r\n				port_number = parseInt(port);\r\n\r\n				if (port_number < 1 || port_number > 65535) {\r\n					throw \'Invalid parameter "{\' + \'$CERT.WEBSITE.PORT} [\' + i + \']" : "\' + port_number + \'" is out of range 1-65535.\';\r\n				}\r\n			}\r\n\r\n			if (!is_empty_ip && is_empty_port) {\r\n				item_name += \', \' + ip;\r\n			} else if (is_empty_ip && !is_empty_port) {\r\n				item_name += \':\' + port;\r\n			} else if (!is_empty_ip && !is_empty_port) {\r\n				item_name += \', \' + ip + \':\' + port;\r\n			}\r\n\r\n			data.push(\r\n				{\r\n					hostname: array_hostname[i].trim(),\r\n					port: port,\r\n					ip: ip,\r\n					key: item_name\r\n				}\r\n			);\r\n		}\r\n\r\n		return {\r\n			data: data,\r\n			errors: errors\r\n		};\r\n	}\r\n};\r\n\r\nvar lld_data = {\r\n	error: {\r\n		message: \'\',\r\n		code: 0\r\n	},\r\n	data: []\r\n};\r\n\r\ntry {\r\n	Cert.checkParams(JSON.parse(value));\r\n	var parse_result = Cert.parseParams();\r\n	if (parse_result[\'errors\'].length > 0) {\r\n		lld_data.error.message = \'Incorrect parameters: [\' + parse_result[\'errors\'].toString() + \'].\';\r\n		lld_data.error.code = 1;\r\n	}\r\n	lld_data.data = parse_result[\'data\']\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	lld_data.error.message = error;\r\n	lld_data.error.code = 2;\r\n}\r\n\r\nreturn JSON.stringify(lld_data);','','0','','','','','0',NULL,'Parses the parameters from user macros and returns a JSON string used in LLD.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','843c78d532c24da7bc02a065783472c6','0','2','0'),
('50239','21','','10638','Get data','cert.get.data','1m','1h','0','0','4','','','','',NULL,NULL,'var Cert = {\r\n	params: {},\r\n\r\n	checkParams: function (params) {\r\n		if (typeof params !== \'object\') {\r\n			throw \'Error of parameter processing.\'\r\n		}\r\n\r\n		[\'hostnames\'].forEach(function (field) {\r\n			if (typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required params is not set:\' + field + \'.\';\r\n			}\r\n		});\r\n\r\n		[\'port\', \'ip\', \'check\'].forEach(function (field) {\r\n			if (typeof params[field] === \'undefined\') {\r\n				params[field] = \'\';\r\n			}\r\n		});\r\n\r\n		Cert.params = params;\r\n	},\r\n\r\n	parseParams: function () {\r\n		var array_hostname = Cert.params[\'hostnames\'].split(\',\'),\r\n			array_port = Cert.params[\'port\'].split(\',\'),\r\n			array_ip = Cert.params[\'ip\'].split(\',\'),\r\n			data = [],\r\n			errors = [];\r\n\r\n		for (var i = 0; i < Math.max(array_hostname.length, array_port.length, array_ip.length); i++) {\r\n			if (typeof array_hostname[i] === \'undefined\' || array_hostname[i].trim() === \'\') {\r\n				if (Cert.params[\'check\'] === \'STRICT\') {\r\n					throw \'Invalid parameter "{\' + \'$CERT.WEBSITE.HOSTNAME} [\' + i + \']" : host is required.\'\r\n				} else {\r\n					errors.push(i);\r\n					continue;\r\n				}\r\n			}\r\n\r\n			item_name = array_hostname[i].trim();\r\n			ip = typeof array_ip[i] === \'undefined\' ? \'\' : array_ip[i].trim();\r\n			port = typeof array_port[i] === \'undefined\' ? \'\' : array_port[i].trim();\r\n\r\n			is_empty_ip = ip === \'\';\r\n			is_empty_port = port === \'\' || port === \'443\';\r\n\r\n			if (!is_empty_port) {\r\n\r\n				if (!/^\\d+$/.test(port)) {\r\n					throw \'Invalid parameter "{\' + \'$CERT.WEBSITE.PORT} [\' + i + \']" : error parse value "\' + port + \'".\';\r\n				}\r\n\r\n				port_number = parseInt(port);\r\n\r\n				if (port_number < 1 || port_number > 65535) {\r\n					throw \'Invalid parameter "{\' + \'$CERT.WEBSITE.PORT} [\' + i + \']" : "\' + port_number + \'" is out of range 1-65535.\';\r\n				}\r\n			}\r\n\r\n			if (!is_empty_ip && is_empty_port) {\r\n				item_name += \', \' + ip;\r\n			} else if (is_empty_ip && !is_empty_port) {\r\n				item_name += \':\' + port;\r\n			} else if (!is_empty_ip && !is_empty_port) {\r\n				item_name += \', \' + ip + \':\' + port;\r\n			}\r\n\r\n			data.push(\r\n				{\r\n					hostname: array_hostname[i].trim(),\r\n					port: port,\r\n					ip: ip,\r\n					key: item_name\r\n				}\r\n			);\r\n		}\r\n\r\n		return {\r\n			data: data,\r\n			errors: errors\r\n		};\r\n	}\r\n};\r\n\r\nvar lld_data = {\r\n	error: {\r\n		message: \'\',\r\n		code: 0\r\n	},\r\n	data: []\r\n};\r\n\r\ntry {\r\n	Cert.checkParams(JSON.parse(value));\r\n	var parse_result = Cert.parseParams();\r\n	if (parse_result[\'errors\'].length > 0) {\r\n		lld_data.error.message = \'Incorrect parameters: [\' + parse_result[\'errors\'].toString() + \'].\';\r\n		lld_data.error.code = 1;\r\n	}\r\n	lld_data.data = parse_result[\'data\']\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	lld_data.error.message = error;\r\n	lld_data.error.code = 2;\r\n}\r\n\r\nreturn JSON.stringify(lld_data);','','0','','','','','0',NULL,'Parses the parameters from user macros and returns a JSON string used in LLD.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','740d4c8d7fdb42a4b7e4569e6b325a5d','0','2','0'),
('51785','5','','10047','Zabbix preprocessing','zabbix[preprocessing]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','0',NULL,'The master item of Zabbix server\'s preprocessing statistics.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5d253eac13394305a85d6c01a4a0774e','0','2','0'),
('52113','21','','10690','Get data','azure.vault.data.get','1m','0','0','0','4','','','','',NULL,NULL,'var Azure = {\r\n	params: {},\r\n	token: null,\r\n\r\n	setParams: function (params) {\r\n		[\'app_id\', \'password\', \'tenant_id\', \'subscription_id\', \'resource_id\', \'period\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: \' + field + \'.\';\r\n			}\r\n		});\r\n\r\n		Azure.params = params;\r\n	},\r\n\r\n	login: function () {\r\n		var response, login = new HttpRequest();\r\n\r\n		if (typeof Azure.params.proxy !== \'undefined\' && Azure.params.proxy !== \'\') {\r\n			login.setProxy(Azure.params.proxy);\r\n		}\r\n\r\n		login.addHeader(\'Content-Type: application/x-www-form-urlencoded\');\r\n		response = login.post(\r\n			\'https://login.microsoftonline.com/\' + encodeURIComponent(Azure.params.tenant_id) + \'/oauth2/token\',\r\n			\'grant_type=client_credentials&resource=\' + encodeURIComponent(\'https://management.azure.com/\') + \'&client_id=\' + encodeURIComponent(Azure.params.app_id) + \'&client_secret=\' + encodeURIComponent(Azure.params.password)\r\n		);\r\n\r\n		if (login.getStatus() !== 200) {\r\n			throw \'Login failed with status code \' + login.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse login session response.\';\r\n		}\r\n\r\n		if (!response.hasOwnProperty(\'access_token\')) {\r\n			throw \'Authentication response does not contain access token.\';\r\n		}\r\n\r\n		Azure.token = response[\'access_token\'];\r\n	},\r\n\r\n	request: function (url) {\r\n		var response, request = new HttpRequest();\r\n\r\n		if (typeof Azure.params.proxy !== \'undefined\' && Azure.params.proxy !== \'\') {\r\n			request.setProxy(Azure.params.proxy);\r\n		}\r\n\r\n		if (!Azure.token) {\r\n			throw \'Request does not contain access token.\';\r\n		}\r\n\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Authorization: Bearer \' + Azure.token);\r\n		Zabbix.log(4, \'[ Azure Vault ] request url: \' + url);\r\n\r\n		response = request.get(url);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			return JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from API.\';\r\n		}\r\n	},\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var data = {},\r\n			end_date = new Date(),\r\n			start_date = new Date();\r\n\r\n		function formatDate(date) {\r\n			var year = date.getFullYear(),\r\n				month = (date.getMonth() + 1),\r\n				day = date.getDate(),\r\n				hours = date.getHours(),\r\n				minutes = date.getMinutes(),\r\n				seconds = date.getSeconds(),\r\n				ampm = hours >= 12 ? \'PM\' : \'AM\';\r\n\r\n			hours = hours % 12 || 12;\r\n			month = month < 10 ? \'0\' + month : month;\r\n			day = day < 10 ? \'0\' + day : day;\r\n			hours = hours < 10 ? \'0\' + hours : hours;\r\n			minutes = minutes < 10 ? \'0\' + minutes : minutes;\r\n			seconds = seconds < 10 ? \'0\' + seconds : seconds;\r\n\r\n			formatted_date = year + \'-\' + month + \'-\' + day + \' \' + hours + \':\' + minutes + \':\' + seconds + \' \' + ampm;\r\n\r\n			return formatted_date\r\n		};\r\n\r\n		start_date.setDate(start_date.getDate() - Azure.params.period);\r\n		end_date = encodeURIComponent(\'\\\'\' + formatDate(end_date) + \'\\\'\');\r\n		start_date = encodeURIComponent(\'\\\'\' + formatDate(start_date) + \'\\\'\');\r\n		date_filter = \'&$filter=\' + encodeURIComponent(\'startTime eq \') + start_date + encodeURIComponent(\' and endTime eq \') + end_date;\r\n\r\n		data.health = Azure.getField(Azure.request(\'https://management.azure.com\' + Azure.params.resource_id + \'/providers/Microsoft.ResourceHealth/availabilityStatuses?api-version=2020-05-01\'), \'value.0.properties\');\r\n		data.jobs = Azure.getField(Azure.request(\'https://management.azure.com\' + Azure.params.resource_id + \'/backupjobs?api-version=2025-01-01\' + date_filter), \'value\');\r\n\r\n		return data\r\n	}\r\n};\r\n\r\ntry {\r\n	Azure.setParams(JSON.parse(value));\r\n	Azure.login();\r\n	return JSON.stringify(Azure.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ Azure Vault ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','0',NULL,'Gathers data of the Azure vault.','0','7d','0','',NULL,'{$AZURE.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','57d191150c06423daa1674d09c846dc7','0','2','0'),
('59368','19','','10600','Device [{#NAME}]:[{#ID}]: Raw data resources status','acronis.cpc.device.res.status.raw[{#NAME}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Gets statuses for device resources.','0','7d','0','',NULL,'15s','{$ACRONIS.CPC.DATACENTER.URL}{$ACRONIS.CPC.PATH.RESOURCE.MANAGEMENT}/resource_statuses','[{"resource_id":"{#ID}"},{"include_attributes":"true"}]','','','1','0','{$ACRONIS.CPC.HTTP.PROXY}','Accept: application/json\r\nAuthorization: Bearer {$ACRONIS.CPC.ACCESS_TOKEN}\r\nX-Application-Secret: 5619386d-de56-49ec-8508-f5c399d3b9bd','0','0','0','0','0','0','0','20d93972ca2f47af96aed7ee9aa642af','0','2','0'),
('59389','16','','10358','Brokers discovery','jmx.discovery[beans,"org.apache.activemq:type=Broker,brokerName=*"]','1h','31d','365d','0','4','','','{7834} and {7835}','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','1',NULL,'Discovery of brokers','0','7d','3','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','cbd9f98c2c1e412081a546e18066a868','0','2','0'),
('59390','16','','10358','Destinations discovery','jmx.discovery[beans,"org.apache.activemq:type=Broker,brokerName=*,destinationType=*,destinationName=*"]','1h','31d','365d','0','4','','','{7836} and {7837}','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','1',NULL,'Discovery of destinations','0','7d','3','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','14432547793d42d2b75c7b08fcbb3545','0','2','0'),
('59391','16','','10358','Broker {#JMXBROKERNAME}: Version','jmx[{#JMXOBJ},BrokerVersion]','1m','31d','0','0','4','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'The version of the broker.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','29a0f197bfe847d596dad4923364490e','0','2','0'),
('59392','16','','10358','Broker {#JMXBROKERNAME}: Memory limit','jmx[{#JMXOBJ},MemoryLimit]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Memory limit, in bytes, used for holding undelivered messages before paging to temporary storage.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','85c19ccb8b6a4242a8ba699e76836427','0','2','0'),
('59393','16','','10358','Broker {#JMXBROKERNAME}: Memory usage in percents','jmx[{#JMXOBJ}, MemoryPercentUsage]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Percent of memory limit used.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5e2a5638adf6405087014bfcfc8ffc93','0','2','0'),
('59394','16','','10358','Broker {#JMXBROKERNAME}: Storage limit','jmx[{#JMXOBJ},StoreLimit]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Disk limit, in bytes, used for persistent messages before producers are blocked.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','78806476b5cb4ce48f8ca8dbd173c7c3','0','2','0'),
('59395','16','','10358','Broker {#JMXBROKERNAME}: Storage usage in percents','jmx[{#JMXOBJ},StorePercentUsage]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Percent of store limit used.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fc4c79543a6f4b7b9c22f11b61b644c9','0','2','0'),
('59396','16','','10358','Broker {#JMXBROKERNAME}: Temp limit','jmx[{#JMXOBJ},TempLimit]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Disk limit, in bytes, used for non-persistent messages and temporary data before producers are blocked.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','09db80ee80ea47189142130d35a8e1c2','0','2','0'),
('59397','16','','10358','Broker {#JMXBROKERNAME}: Temp usage in percents','jmx[{#JMXOBJ},TempPercentUsage]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Percent of temp limit used.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','95354144839e4d22a82c4e9a1fab83d9','0','2','0'),
('59398','16','','10358','Broker {#JMXBROKERNAME}: Consumers count total','jmx[{#JMXOBJ},TotalConsumerCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Number of consumers attached to this broker.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','64ab04e456804e10a6c78c3190807506','0','2','0'),
('59399','16','','10358','Broker {#JMXBROKERNAME}: Messages dequeue rate','jmx[{#JMXOBJ},TotalDequeueCount]','1m','31d','365d','0','3','','messages/sec','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Rate of messages that have been delivered by the broker and acknowledged by consumers.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','48bc7dab4a1a40d8a823e880018cf8e7','0','2','0'),
('59400','16','','10358','Broker {#JMXBROKERNAME}: Messages enqueue rate','jmx[{#JMXOBJ},TotalEnqueueCount]','1m','31d','365d','0','3','','messages/sec','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Rate of messages that have been sent to the broker.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a462499eecbd443e931a9aa831240f65','0','2','0'),
('59401','16','','10358','Broker {#JMXBROKERNAME}: Producers count total','jmx[{#JMXOBJ},TotalProducerCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Number of producers attached to this broker.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','2453d8221cec4e1ead6622c001ac9a8c','0','2','0'),
('59402','16','','10358','Broker {#JMXBROKERNAME}: Uptime','jmx[{#JMXOBJ},UptimeMillis]','1m','31d','365d','0','3','','s','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'The uptime of the broker.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a46d7281cb234ccaadacbb7d311cbd39','0','2','0'),
('59403','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Consumers count total on {#JMXBROKERNAME}','jmx["org.apache.activemq:type=Broker,brokerName={#JMXBROKERNAME}",{$ACTIVEMQ.TOTAL.CONSUMERS.COUNT: "{#JMXDESTINATIONNAME}"}]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Number of consumers attached to the broker of this destination. Used to suppress destination\'s triggers when the count of consumers on the broker is lower than threshold.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fd8129c9a66043d896a70c91c8b0d471','0','2','0'),
('59404','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Producers count total on {#JMXBROKERNAME}','jmx["org.apache.activemq:type=Broker,brokerName={#JMXBROKERNAME}",{$ACTIVEMQ.TOTAL.PRODUCERS.COUNT: "{#JMXDESTINATIONNAME}"}]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Number of producers attached to the broker of this destination. Used to suppress destination\'s triggers when the count of producers on the broker is lower than threshold.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','99f2094b02f848e785e40296958c5450','0','2','0'),
('59405','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Consumers count','jmx[{#JMXOBJ},ConsumerCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Number of consumers attached to this destination.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5e93e53a0c2d49a49d421ded87b6b1f8','0','2','0'),
('59406','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Messages dequeue rate','jmx[{#JMXOBJ},DequeueCount]','1m','31d','365d','0','3','','messages/sec','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Rate of messages that has been acknowledged (and removed) from the destination.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3536ec77069a434e854415f0a3270e67','0','2','0'),
('59407','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Messages enqueue rate','jmx[{#JMXOBJ},EnqueueCount]','1m','31d','365d','0','3','','messages/sec','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Rate of messages that have been sent to the destination.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a6dacc8c4d1f4724bf49c63449992035','0','2','0'),
('59408','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Expired messages count','jmx[{#JMXOBJ},ExpiredCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Number of messages that have been expired.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1c4ea913a9564d74b31ef82314203a15','0','2','0'),
('59409','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Memory usage in percents','jmx[{#JMXOBJ},MemoryPercentUsage]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'The percentage of the memory limit used.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','158fac5a1b3c4f07a4004a733f9b6995','0','2','0'),
('59410','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Producers count','jmx[{#JMXOBJ},ProducerCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Number of producers attached to this destination.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','82ee74872f6e46efbf16ae0705bcf2a6','0','2','0'),
('59411','16','','10358','{#JMXBROKERNAME}: {#JMXDESTINATIONTYPE} {#JMXDESTINATIONNAME}: Queue size','jmx[{#JMXOBJ},QueueSize]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$ACTIVEMQ.USER}','{$ACTIVEMQ.PASSWORD}','','','2',NULL,'Number of messages on this destination, including any that have been dispatched but not acknowledged.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fdc1e26fbe6545d3bdfc86f6f8c91b8b','0','2','0'),
('59414','0','','10264','CPU utilization','proc.cpu.util[{#APACHE.NAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'The percentage of the CPU utilization by a process {#APACHE.NAME}.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b73280fb0af64c7899abfc74cc074b13','0','2','0'),
('59428','7','','10637','CPU utilization','proc.cpu.util[{#APACHE.NAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'The percentage of the CPU utilization by a process {#APACHE.NAME}.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b1e48077179f4e439e2d3c3b918c9a03','0','2','0'),
('59489','0','','10353','OSD','ceph.osd.discovery["{$CEPH.CONNSTRING}","{$CEPH.USER}","{$CEPH.API.KEY}"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','374557a43a824d938e9a8e656151e0c9','0','2','0'),
('59490','0','','10353','Pool','ceph.pool.discovery["{$CEPH.CONNSTRING}","{$CEPH.USER}","{$CEPH.API.KEY}"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fb6b4d27f46e4160ad978244aa845d0e','0','2','0'),
('59507','0','','10413','[{#CERT.WEBSITE.ITEMNAME}]: Get','web.certificate.get[{#CERT.WEBSITE.HOSTNAME},{#CERT.WEBSITE.PORT},{#CERT.WEBSITE.IP}]','15m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Returns a JSON with the attributes of a certificate of the requested site.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5c4e35db1c8449589e2d892250e907c7','0','2','0'),
('59521','7','','10638','[{#CERT.WEBSITE.ITEMNAME}]: Get','web.certificate.get[{#CERT.WEBSITE.HOSTNAME},{#CERT.WEBSITE.PORT},{#CERT.WEBSITE.IP}]','15m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Returns a JSON with the attributes of a certificate of the requested site.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a25c6330c9fb43618f8d2e7acdc8f522','0','2','0'),
('59559','19','','10522','["{#SERVICE_NAME}"]: Get raw service state','consul.get_service_stats["{#SERVICE_NAME}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieve service instances providing the service indicated on the path.','0','7d','0','',NULL,'15s','{$CONSUL.CLUSTER.URL}/v1/health/service/{#SERVICE_NAME}','','','200, 429, 503','1','0','','X-Consul-Token: {$CONSUL.TOKEN}\r\nX-Consul-Namespace: {$CONSUL.NAMESPACE}','0','0','0','0','0','0','0','38576dd458a94259ab273204ffe9aebd','0','2','0'),
('59585','0','','10318','Containers discovery','docker.containers.discovery[false]','15m','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of containers metrics.\r\n\r\nParameter:\r\ntrue  - Returns all containers\r\nfalse - Returns only running containers','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6f379dce9d3440018deb2c2cbaa91c06','0','2','0'),
('59586','0','','10318','Images discovery','docker.images.discovery','15m','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of images metrics.','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0b31468772c942cc8a401af2d33f17d2','0','2','0'),
('59587','0','','10318','Container {#NAME}: Get info','docker.container_info["{#NAME}",full]','1m','0','0','0','1','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Return low-level information about a container.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','743e2c9545de49c89472e343bf8d38da','0','2','0'),
('59588','0','','10318','Container {#NAME}: Get stats','docker.container_stats["{#NAME}"]','1m','0','0','0','1','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Get container stats based on resource usage.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4192b5b8be2545568637b7121c1466c1','0','2','0'),
('59629','19','','10322','Cluster nodes discovery','es.nodes.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'','','1','{$ELASTICSEARCH.USERNAME}','{$ELASTICSEARCH.PASSWORD}','','','1',NULL,'Discovery ES cluster nodes.','0','7d','0','',NULL,'15s','{$ELASTICSEARCH.SCHEME}://{$ELASTICSEARCH.HOST}:{$ELASTICSEARCH.PORT}/_nodes/_all/nodes','','','200','1','0','','','0','0','0','0','0','0','0','5105173f24d941b2969fe3d190d22e82','0','2','0'),
('59630','15','','10322','ES {#ES.NODE}: Flush latency','es.node.indices.flush.latency[{#ES.NODE}]','1m','31d','365d','0','0','','ms','','',NULL,NULL,'change(//es.node.indices.flush.total_time_in_millis[{#ES.NODE}]) / ( change(//es.node.indices.flush.total[{#ES.NODE}]) + (change(//es.node.indices.flush.total[{#ES.NODE}]) = 0) )','','0','','','','','2',NULL,'The average flush latency calculated from the available flush.total and flush.total_time_in_millis metrics.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c530311329e348cca74c38fa2260236b','0','2','0'),
('59631','15','','10322','ES {#ES.NODE}: Indexing latency','es.node.indices.indexing.index_latency[{#ES.NODE}]','1m','31d','365d','0','0','','ms','','',NULL,NULL,'change(//es.node.indices.indexing.index_time_in_millis[{#ES.NODE}]) / ( change(//es.node.indices.indexing.index_total[{#ES.NODE}]) + (change(//es.node.indices.indexing.index_total[{#ES.NODE}]) = 0) )','','0','','','','','2',NULL,'The average indexing latency calculated from the available index_total and index_time_in_millis metrics.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','23f54c51c30a4dbdbef48611a7907db6','0','2','0'),
('59632','15','','10322','ES {#ES.NODE}: Fetch latency','es.node.indices.search.fetch_latency[{#ES.NODE}]','1m','31d','365d','0','0','','ms','','',NULL,NULL,'change(//es.node.indices.search.fetch_time_in_millis[{#ES.NODE}]) / ( change(//es.node.indices.search.fetch_total[{#ES.NODE}]) + (change(//es.node.indices.search.fetch_total[{#ES.NODE}]) = 0) )','','0','','','','','2',NULL,'The average fetch latency calculated by sampling the total number of fetches and the total elapsed time at regular intervals.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','79b5fd5e04e249da9f73fbe68915fdb1','0','2','0'),
('59633','15','','10322','ES {#ES.NODE}: Query latency','es.node.indices.search.query_latency[{#ES.NODE}]','1m','31d','365d','0','0','','ms','','',NULL,NULL,'change(//es.node.indices.search.query_time_in_millis[{#ES.NODE}]) /\r\n( change(//es.node.indices.search.query_total[{#ES.NODE}]) + (change(//es.node.indices.search.query_total[{#ES.NODE}]) = 0) )','','0','','','','','2',NULL,'The average query latency calculated by sampling the total number of queries and the total elapsed time at regular intervals.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fadb6fe530ab4b1296d4c17728667b12','0','2','0'),
('59679','15','','10520','Cluster ["{#CLUSTER_NAME}"]: Membership, unhealthy','envoy.cluster.membership_unhealthy["{#CLUSTER_NAME}"]','1m','31d','365d','0','3','','','','',NULL,NULL,'last(//envoy.cluster.membership_total["{#CLUSTER_NAME}"]) - last(//envoy.cluster.membership_healthy["{#CLUSTER_NAME}"])','','0','','','','','2',NULL,'Current cluster unhealthy.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d453ade473ae4beaab06afa117814a1b','0','2','0'),
('59713','0','','10360','Databases discovery','perf_instance.discovery["MSExchange Active Manager"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of Exchange databases.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f3d6e34eaff844bfab582cb55d679e82','0','2','0'),
('59714','0','','10360','LDAP discovery','perf_instance_en.discovery["MSExchange ADAccess Domain Controllers"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of domain controller.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','635f8c96cf544dcd97e4a58b2e9353de','0','2','0'),
('59715','0','','10360','Web services discovery','perf_instance_en.discovery["Web Service"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of Exchange web services.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8a1cb7e22e55406e8e721a2189d7e00d','0','2','0'),
('59716','0','','10360','Active Manager [{#INSTANCE}]: Database copy role','perf_counter_en["\\MSExchange Active Manager({#INSTANCE})\\Database Copy Role Active"]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,'185','','','0','','','','','2',NULL,'Database copy active or passive role.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0b2d46b766f24947b76b49d8368044a5','0','2','0'),
('59717','0','','10360','Information Store [{#INSTANCE}]: Page faults per second','perf_counter_en["\\MSExchange Database({#INF.STORE})\\Database Page Fault Stalls/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Indicates the rate of page faults that can\'t be serviced because there are no pages available for allocation from the database cache. If this counter is above 0, it\'s an indication that the MSExchange Database\\I/O Database Writes (Attached) Average Latency is too high.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9ad0743878ed411ab1e76b8e774e91e9','0','2','0'),
('59718','0','','10360','Information Store [{#INSTANCE}]: Log records stalled','perf_counter_en["\\MSExchange Database({#INF.STORE})\\Log Record Stalls/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Indicates the number of log records that can\'t be added to the log buffers per second because the log buffers are full. The average value should be below 10 per second. Spikes (maximum values) shouldn\'t be higher than 100 per second.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1af9e0b4abb74e07af1d0d183333f0c4','0','2','0'),
('59719','0','','10360','Information Store [{#INSTANCE}]: Log threads waiting','perf_counter_en["\\MSExchange Database({#INF.STORE})\\Log Threads Waiting", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Indicates the number of threads waiting to complete an update of the database by writing their data to the log.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1b53de26c73a49bdb7fe55328db03ddd','0','2','0'),
('59720','0','','10360','Database Counters [{#INSTANCE}]: Active database read operations per second','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Reads (Attached)/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the number of database read operations.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1da31e52e5dd4b72bea5811a9bb06a01','0','2','0'),
('59721','0','','10360','Database Counters [{#INSTANCE}]: Active database read operations latency','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Reads (Attached) Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the average length of time per database read operation. Should be less than 20 ms on average.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0bc5750ca13f4f738904e45f9860b76a','0','2','0'),
('59722','0','','10360','Database Counters [{#INSTANCE}]: Passive database read operations latency','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Reads (Recovery) Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the average length of time per passive database read operation. Should be less than 200ms on average.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3095c843659341fd854fb297a9fdf14a','0','2','0'),
('59723','0','','10360','Database Counters [{#INSTANCE}]: Active database write operations per second','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Writes (Attached)/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the number of database write operations per second for each attached database instance.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7456bcbbac114ead9c417bcbeefa0e1c','0','2','0'),
('59724','0','','10360','Database Counters [{#INSTANCE}]: Active database write operations latency','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Writes (Attached) Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the average length of time per database write operation. Should be less than 50ms on average.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','e45413cc0e46458f9a00132b30c7c354','0','2','0'),
('59725','0','','10360','Database Counters [{#INSTANCE}]: Passive database write operations latency','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Writes (Recovery) Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the average length of time, in ms, per passive database write operation. Should be less than the read latency for the same instance, as measured by the MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Reads (Recovery) Average Latency counter.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5b7fc1949b67404584d2809556f3d595','0','2','0'),
('59726','0','','10360','Information Store [{#INSTANCE}]: Active mailboxes count','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\Active mailboxes"]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Number of active mailboxes in this database.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6128c55bf63a4c48981dfccd077b4635','0','2','0'),
('59727','0','','10360','Information Store [{#INSTANCE}]: Database state','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\Database State"]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,'187','','','0','','','','','2',NULL,'Database state. Possible values:\r\n0: Database without any copy and dismounted.\r\n1: Database is a primary database and mounted.\r\n2: Database is a passive copy and the state is healthy.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4db79306eb044db899be5e7672651959','0','2','0'),
('59728','0','','10360','Information Store [{#INSTANCE}]: RPC requests latency','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\RPC Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'RPC Latency average is the average latency of RPC requests per database. Average is calculated over all RPCs since exrpc32 was loaded. Should be less than 50ms at all times, with spikes less than 100ms.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6bc9bc6d20df4de89ff03d63f21f6eab','0','2','0'),
('59729','0','','10360','Information Store [{#INSTANCE}]: RPC requests per second','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\RPC Operations/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the number of RPC operations per second for each database instance.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5321c367d288406d8d9eac217a444e9c','0','2','0'),
('59730','0','','10360','Information Store [{#INSTANCE}]: RPC requests total','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\RPC requests", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Indicates the overall RPC requests currently executing within the information store process. Should be below 70 at all times.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','701d6a4fcfe14f899e0282eb75e08753','0','2','0'),
('59731','0','','10360','Domain Controller [{#INSTANCE}]: Read time','perf_counter_en["\\MSExchange ADAccess Domain Controllers({#INSTANCE})\\LDAP Read Time", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Time that it takes to send an LDAP read request to the domain controller in question and get a response. Should ideally be below 50 ms; spikes below 100 ms are acceptable.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b1c046c5aca04b85bf907f83c05b4142','0','2','0'),
('59732','0','','10360','Domain Controller [{#INSTANCE}]: Search time','perf_counter_en["\\MSExchange ADAccess Domain Controllers({#INSTANCE})\\LDAP Search Time", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Time that it takes to send an LDAP search request and get a response. Should ideally be below 50 ms; spikes below 100 ms are acceptable.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c7326e542e534afd9a1df9a8ec1226e4','0','2','0'),
('59733','0','','10360','Web Service [{#INSTANCE}]: Current connections','perf_counter_en["\\Web Service({#INSTANCE})\\Current Connections", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the current number of connections established to the each Web Service.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3c3d1881bb294a31afa09605699a6965','0','2','0'),
('59734','7','','10361','Databases discovery','perf_instance.discovery["MSExchange Active Manager"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of Exchange databases.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3b23aa50517a4081b8463f694757cd0c','0','2','0'),
('59735','7','','10361','LDAP discovery','perf_instance_en.discovery["MSExchange ADAccess Domain Controllers"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of domain controller.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c18f965b9ba6419ea578238ebc8168bb','0','2','0'),
('59736','7','','10361','Web services discovery','perf_instance_en.discovery["Web Service"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of Exchange web services.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8749f11f547546ac8bf81478c798186f','0','2','0'),
('59737','7','','10361','Active Manager [{#INSTANCE}]: Database copy role','perf_counter_en["\\MSExchange Active Manager({#INSTANCE})\\Database Copy Role Active"]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,'186','','','0','','','','','2',NULL,'Database copy active or passive role.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7e0a5f324690432199728f577dbcc91a','0','2','0'),
('59738','7','','10361','Information Store [{#INSTANCE}]: Page faults per second','perf_counter_en["\\MSExchange Database({#INF.STORE})\\Database Page Fault Stalls/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Indicates the rate of page faults that can\'t be serviced because there are no pages available for allocation from the database cache. If this counter is above 0, it\'s an indication that the MSExchange Database\\I/O Database Writes (Attached) Average Latency is too high.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','947396e622b24e2090a23607ee7a06a4','0','2','0'),
('59739','7','','10361','Information Store [{#INSTANCE}]: Log records stalled','perf_counter_en["\\MSExchange Database({#INF.STORE})\\Log Record Stalls/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Indicates the number of log records that can\'t be added to the log buffers per second because the log buffers are full. The average value should be below 10 per second. Spikes (maximum values) shouldn\'t be higher than 100 per second.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8c1ca3d79ef445668e8a5ba04a278e6f','0','2','0'),
('59740','7','','10361','Information Store [{#INSTANCE}]: Log threads waiting','perf_counter_en["\\MSExchange Database({#INF.STORE})\\Log Threads Waiting", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Indicates the number of threads waiting to complete an update of the database by writing their data to the log.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9173dba68e55434aaa324b3e38ba22bb','0','2','0'),
('59741','7','','10361','Database Counters [{#INSTANCE}]: Active database read operations per second','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Reads (Attached)/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the number of database read operations.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9ad96174c29142f6904322d08d76fe8e','0','2','0'),
('59742','7','','10361','Database Counters [{#INSTANCE}]: Active database read operations latency','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Reads (Attached) Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the average length of time per database read operation. Should be less than 20 ms on average.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0df865f52f304f97aa01a706e455e153','0','2','0'),
('59743','7','','10361','Database Counters [{#INSTANCE}]: Passive database read operations latency','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Reads (Recovery) Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the average length of time per passive database read operation. Should be less than 200ms on average.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8381c3c3971f4b3380cfe5d663e31416','0','2','0'),
('59744','7','','10361','Database Counters [{#INSTANCE}]: Active database write operations per second','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Writes (Attached)/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the number of database write operations per second for each attached database instance.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','defb4f7dfb6f4a97a4928bab82897845','0','2','0'),
('59745','7','','10361','Database Counters [{#INSTANCE}]: Active database write operations latency','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Writes (Attached) Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the average length of time per database write operation. Should be less than 50ms on average.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9c83e27f56f94bea9e635158037a0c8b','0','2','0'),
('59746','7','','10361','Database Counters [{#INSTANCE}]: Passive database write operations latency','perf_counter_en["\\MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Writes (Recovery) Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the average length of time, in ms, per passive database write operation. Should be less than the read latency for the same instance, as measured by the MSExchange Database ==> Instances({#INF.STORE}/_Total)\\I/O Database Reads (Recovery) Average Latency counter.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a53596604a4c4a49bd04bfda30064d78','0','2','0'),
('59747','7','','10361','Information Store [{#INSTANCE}]: Active mailboxes count','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\Active mailboxes"]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Number of active mailboxes in this database.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9ef13ef1197a4ba1abba1591ae588fa8','0','2','0'),
('59748','7','','10361','Information Store [{#INSTANCE}]: Database state','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\Database State"]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,'188','','','0','','','','','2',NULL,'Database state. Possible values:\r\n0: Database without any copy and dismounted.\r\n1: Database is a primary database and mounted.\r\n2: Database is a passive copy and the state is healthy.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0e3dbea7e5694cc48c5216d92db67f7f','0','2','0'),
('59749','7','','10361','Information Store [{#INSTANCE}]: RPC requests latency','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\RPC Average Latency", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'RPC Latency average is the average latency of RPC requests per database. Average is calculated over all RPCs since exrpc32 was loaded. Should be less than 50ms at all times, with spikes less than 100ms.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4a08076fdfcb4226a122474f5c2e98d9','0','2','0'),
('59750','7','','10361','Information Store [{#INSTANCE}]: RPC requests per second','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\RPC Operations/sec", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the number of RPC operations per second for each database instance.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c423048154634eb29f4fe56c306f5b04','0','2','0'),
('59751','7','','10361','Information Store [{#INSTANCE}]: RPC requests total','perf_counter_en["\\MSExchangeIS Store({#INSTANCE})\\RPC requests", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Indicates the overall RPC requests currently executing within the information store process. Should be below 70 at all times.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0f4970d43155441ab0f860e4e06328e0','0','2','0'),
('59752','7','','10361','Domain Controller [{#INSTANCE}]: Read time','perf_counter_en["\\MSExchange ADAccess Domain Controllers({#INSTANCE})\\LDAP Read Time", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Time that it takes to send an LDAP read request to the domain controller in question and get a response. Should ideally be below 50 ms; spikes below 100 ms are acceptable.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','577f868ff1e54113b61e8f74a084f611','0','2','0'),
('59753','7','','10361','Domain Controller [{#INSTANCE}]: Search time','perf_counter_en["\\MSExchange ADAccess Domain Controllers({#INSTANCE})\\LDAP Search Time", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'Time that it takes to send an LDAP search request and get a response. Should ideally be below 50 ms; spikes below 100 ms are acceptable.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1c94a8c06c5a4d4894060b68fc44a093','0','2','0'),
('59754','7','','10361','Web Service [{#INSTANCE}]: Current connections','perf_counter_en["\\Web Service({#INSTANCE})\\Current Connections", {$MS.EXCHANGE.PERF.INTERVAL}]','{$MS.EXCHANGE.PERF.INTERVAL}','31d','365d','0','0','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Shows the current number of connections established to the each Web Service.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','91f7649f17bf4d7a9ded8bec70ff09e2','0','2','0'),
('59755','16','','10169','Garbage collector discovery','jmx.discovery["beans","java.lang:name=*,type=GarbageCollector"]','4h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','1',NULL,'Garbage collectors metrics discovery.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7e0c60c6b1b34b5c99fa446076f35c28','0','2','0'),
('59756','16','','10169','Memory pool discovery','jmx.discovery["beans","java.lang:name=*,type=MemoryPool"]','4h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','1',NULL,'Memory pools metrics discovery.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b5dfe8bb0a754289a716092ad305ceed','0','2','0'),
('59757','16','','10169','GarbageCollector: {#JMXNAME} number of collections per second','jmx["java.lang:name={#JMXNAME},type=GarbageCollector","CollectionCount"]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Displays the total number of collections that have occurred per second.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','61ad48ae9013481184d33222c7660bef','0','2','0'),
('59758','16','','10169','GarbageCollector: {#JMXNAME} accumulated time spent in collection','jmx["java.lang:name={#JMXNAME},type=GarbageCollector","CollectionTime"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Displays the approximate accumulated collection elapsed time, in seconds.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8e3db2efbe714f918ece15216fae628b','0','2','0'),
('59759','16','','10169','Memory pool: {#JMXNAME} committed','jmx["java.lang:name={#JMXNAME},type=MemoryPool","Usage.committed"]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Current memory allocated.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8b3da0f9b0b64b58b25ffed71a679ed0','0','2','0'),
('59760','16','','10169','Memory pool: {#JMXNAME} maximum size','jmx["java.lang:name={#JMXNAME},type=MemoryPool","Usage.max"]','1m','31d','365d','0','0','','B','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Maximum amount of memory that can be used for memory management. This amount of memory is not guaranteed to be available if it is greater than the amount of committed memory. The Java virtual machine may fail to allocate memory even if the amount of used memory does not exceed this maximum size.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f8504be0098b41a6b789c67f88f1c861','0','2','0'),
('59761','16','','10169','Memory pool: {#JMXNAME} used','jmx["java.lang:name={#JMXNAME},type=MemoryPool","Usage.used"]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Current memory usage.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','74f11991286a474b838898036ebb82e5','0','2','0'),
('59766','21','','10629','Branch [{#BRANCH_NAME}]: Number of commits','github.repo.branches.commits.total[{#BRANCH_NAME}]','{$GITHUB.INTERVAL:"get_commits_count:{#BRANCH_NAME}"}','31d','365d','0','3','','','','',NULL,NULL,'var github = {\r\n	params: {},\r\n\r\n	setParams: function (params, required) {\r\n		required = required || [];\r\n		required.concat([\'api_url\', \'user_agent\', \'api_version\', \'repo_owner\', \'repo_name\', \'pagination_required\', \'api_token\']).forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\'\r\n				|| params[field] === \'\') {\r\n				throw \'Required parameter is not set: "\' + field + \'".\';\r\n			}\r\n		});\r\n\r\n		github.params = params;\r\n\r\n		if (typeof github.params.api_url === \'string\' && !github.params.api_url.endsWith(\'/\')) {\r\n			github.params.api_url += \'/\';\r\n		}\r\n	},\r\n\r\n	apiRequest: function (url, pagination_required) {\r\n		const next_pattern = /<([^>]+)>;\\s*rel="next"/i;\r\n		var request = new HttpRequest(),\r\n			response,\r\n			headers,\r\n			final_data = {\r\n				headers: {},\r\n				data: []\r\n			};\r\n\r\n		pagination_required = (typeof pagination_required !== \'undefined\') ? pagination_required : \'true\';\r\n\r\n		request.addHeader(\'User-Agent: \' + github.params.user_agent);\r\n		request.addHeader(\'Accept: application/vnd.github+json\');\r\n		request.addHeader(\'X-GitHub-Api-Version: \' + github.params.api_version);\r\n		request.addHeader(\'Authorization: Bearer \' + github.params.api_token);\r\n\r\n		if (typeof github.params.http_proxy !== \'undefined\' && github.params.http_proxy !== \'\') {\r\n			request.setProxy(github.params.http_proxy);\r\n			Zabbix.log(4, \'[ GitHub Repo ] Using HTTP proxy: \' + github.params.http_proxy);\r\n		}\r\n\r\n		while (url) {\r\n			Zabbix.log(4, \'[ GitHub Repo ] Sending request: \' + url);\r\n\r\n			response = request.get(url);\r\n\r\n			Zabbix.log(4, \'[ GitHub Repo ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n			if (request.getStatus() < 200 || request.getStatus() >= 300) {\r\n				throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n			}\r\n\r\n			try {\r\n				response = JSON.parse(response);\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from API. Check debug log for more information.\';\r\n			}\r\n\r\n			var parsed_data = github.parseData(response);\r\n			final_data.data = final_data.data.concat(parsed_data);\r\n\r\n			headers = request.getHeaders();\r\n\r\n			url = ((headers.link || \'\').match(next_pattern) || [])[1];\r\n\r\n			if (pagination_required === \'false\') {\r\n				url = \'\';\r\n			}\r\n		}\r\n\r\n		final_data.headers = request.getHeaders();\r\n\r\n		delete request;\r\n\r\n		return final_data;\r\n	},\r\n\r\n	parseData: function (response_data) {\r\n		if (!response_data) {\r\n			return [];\r\n		}\r\n\r\n		const normalization_required = "total_count" in response_data && !("url" in response_data);\r\n		if (!normalization_required) return response_data;\r\n\r\n		delete response_data.incomplete_results;\r\n		delete response_data.repository_selection;\r\n		delete response_data.total_count;\r\n\r\n		const namespaceKey = Object.keys(response_data)[0];\r\n		response_data = response_data[namespaceKey];\r\n\r\n		return response_data;\r\n	},\r\n\r\n	itemsCount: function (response_data) {\r\n		const last_page_number = /<[^>]+page=(\\d+)>;\\s*rel="last"/i;\r\n\r\n		if (response_data.headers.link){\r\n			return response_data.headers.link.match(last_page_number)[1];\r\n		}\r\n\r\n		return response_data.data.length;\r\n	}\r\n}\r\n\r\ntry {\r\n	github.setParams(JSON.parse(value), [\'api_query\']);\r\n\r\n	var result = github.apiRequest(github.params.api_url + github.params.api_query + \'?\' + github.params.query_params || \'\', github.params.pagination_required);\r\n\r\n	return github.itemsCount(result);\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ GitHub Repo ] ERROR: \' + error);\r\n	return JSON.stringify({ error: error });\r\n}','','0','','','','','2',NULL,'Get the number of commits in the branch.\r\n\r\nInformation about endpoint:\r\nhttps://docs.github.com/en/rest/commits/commits?apiVersion=2022-11-28#list-commits','0','7d','0','',NULL,'{$GITHUB.TIMEOUT:"get_commits_count:{#BRANCH_NAME}"}','','','','200','1','0','','','0','0','0','0','0','0','0','927ef4806cc4460a8882c204a9e94817','0','2','0'),
('59767','21','','10629','Workflow [{#WORKFLOW_NAME}]: Get last run','github.repo.workflows.last_run.get[{#WORKFLOW_NAME}]','{$GITHUB.INTERVAL:"get_last_run:{#WORKFLOW_NAME}"}','0','0','0','4','','','','',NULL,NULL,'var github = {\r\n	params: {},\r\n\r\n	setParams: function (params, required) {\r\n		required = required || [];\r\n		required.concat([\'api_url\', \'user_agent\', \'api_version\', \'repo_owner\', \'repo_name\', \'pagination_required\', \'api_token\']).forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\'\r\n				|| params[field] === \'\') {\r\n				throw \'Required parameter is not set: "\' + field + \'".\';\r\n			}\r\n		});\r\n\r\n		github.params = params;\r\n\r\n		if (typeof github.params.api_url === \'string\' && !github.params.api_url.endsWith(\'/\')) {\r\n			github.params.api_url += \'/\';\r\n		}\r\n	},\r\n\r\n	apiRequest: function (url, pagination_required) {\r\n		const next_pattern = /<([^>]+)>;\\s*rel="next"/i;\r\n		var request = new HttpRequest(),\r\n			response,\r\n			headers,\r\n			final_data = {\r\n				headers: {},\r\n				data: []\r\n			};\r\n\r\n		pagination_required = (typeof pagination_required !== \'undefined\') ? pagination_required : \'true\';\r\n\r\n		request.addHeader(\'User-Agent: \' + github.params.user_agent);\r\n		request.addHeader(\'Accept: application/vnd.github+json\');\r\n		request.addHeader(\'X-GitHub-Api-Version: \' + github.params.api_version);\r\n		request.addHeader(\'Authorization: Bearer \' + github.params.api_token);\r\n\r\n		if (typeof github.params.http_proxy !== \'undefined\' && github.params.http_proxy !== \'\') {\r\n			request.setProxy(github.params.http_proxy);\r\n			Zabbix.log(4, \'[ GitHub Repo ] Using HTTP proxy: \' + github.params.http_proxy);\r\n		}\r\n\r\n		while (url) {\r\n			Zabbix.log(4, \'[ GitHub Repo ] Sending request: \' + url);\r\n\r\n			response = request.get(url);\r\n\r\n			Zabbix.log(4, \'[ GitHub Repo ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n			if (request.getStatus() < 200 || request.getStatus() >= 300) {\r\n				throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n			}\r\n\r\n			try {\r\n				response = JSON.parse(response);\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from API. Check debug log for more information.\';\r\n			}\r\n\r\n			var parsed_data = github.parseData(response);\r\n			final_data.data = final_data.data.concat(parsed_data);\r\n\r\n			headers = request.getHeaders();\r\n\r\n			url = ((headers.link || \'\').match(next_pattern) || [])[1];\r\n\r\n			if (pagination_required === \'false\') {\r\n				url = \'\';\r\n			}\r\n		}\r\n\r\n		final_data.headers = request.getHeaders();\r\n\r\n		delete request;\r\n\r\n		return final_data;\r\n	},\r\n\r\n	parseData: function (response_data) {\r\n		if (!response_data) {\r\n			return [];\r\n		}\r\n\r\n		const normalization_required = "total_count" in response_data && !("url" in response_data);\r\n		if (!normalization_required) return response_data;\r\n\r\n		delete response_data.incomplete_results;\r\n		delete response_data.repository_selection;\r\n		delete response_data.total_count;\r\n\r\n		const namespaceKey = Object.keys(response_data)[0];\r\n		response_data = response_data[namespaceKey];\r\n\r\n		return response_data;\r\n	},\r\n\r\n	itemsCount: function (response_data) {\r\n		const last_page_number = /<[^>]+page=(\\d+)>;\\s*rel="last"/i;\r\n\r\n		if (response_data.headers.link){\r\n			return response_data.headers.link.match(last_page_number)[1];\r\n		}\r\n\r\n		return response_data.data.length;\r\n	}\r\n}\r\n\r\ntry {\r\n	github.setParams(JSON.parse(value), [\'api_query\']);\r\n\r\n	var result = github.apiRequest(github.params.api_url + github.params.api_query + \'?\' + github.params.query_params || \'\', github.params.pagination_required);\r\n\r\n	return JSON.stringify(result);\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ GitHub Repo ] ERROR: \' + error);\r\n	return JSON.stringify({ error: error });\r\n}','','0','','','','','2',NULL,'Get the data about the last workflow run.\r\n\r\nInformation about endpoint:\r\nhttps://docs.github.com/en/rest/actions/workflow-runs?apiVersion=2022-11-28#list-workflow-runs-for-a-workflow','0','7d','0','',NULL,'{$GITHUB.TIMEOUT:"get_last_run:{#WORKFLOW_NAME}"}','','','','200','1','0','','','0','0','0','0','0','0','0','32311fa69236401388321fad4ae183d6','0','2','0'),
('59776','19','','10362','Puma metrics discovery','gitlab.puma.discovery','3h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discovery of Puma specific metrics when Puma is used.','0','7d','0','',NULL,'','{$GITLAB.URL}/-/metrics{$GITLAB.HEALTH.TOKEN}','','','200','1','0','','','0','0','0','0','0','0','0','acd3e31daa8f497bb1ce0f91d104d928','0','2','0'),
('59777','19','','10362','Unicorn metrics discovery','gitlab.unicorn.discovery','3h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'DiscoveryUnicorn specific metrics, when Unicorn is used.','0','7d','0','',NULL,'','{$GITLAB.URL}/-/metrics{$GITLAB.HEALTH.TOKEN}','','','200','1','0','','','0','0','0','0','0','0','0','912723d1837641cf9b84996788bd6b54','0','2','0'),
('59791','19','','10363','Data node discovery','hadoop.datanode.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'','0','7d','0','',NULL,'','{$HADOOP.NAMENODE.HOST}:{$HADOOP.NAMENODE.PORT}/jmx?qry=Hadoop:service=NameNode,name=NameNodeInfo','','','200','1','0','','','0','0','0','0','0','0','0','0f05e90a6fc547d18f291ae2264db9d1','0','2','0'),
('59792','19','','10363','Node manager discovery','hadoop.nodemanager.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'','0','7d','0','',NULL,'','{$HADOOP.RESOURCEMANAGER.HOST}:{$HADOOP.RESOURCEMANAGER.PORT}/jmx?qry=Hadoop:service=ResourceManager,name=RMNMInfo','','','200','1','0','','','0','0','0','0','0','0','0','de2d5f97843345668bc0b8c8336b9c14','0','2','0'),
('59793','19','','10363','Hadoop DataNode {#HOSTNAME}: Get stats','hadoop.datanode.get[{#HOSTNAME}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'','0','7d','0','',NULL,'','{#INFOADDR}/jmx','','','200','1','0','','','0','0','0','0','0','0','0','6d2d030b3ddb41a394faede737329bbb','0','2','0'),
('59794','19','','10363','Hadoop NodeManager {#HOSTNAME}: Get stats','hadoop.nodemanager.get[{#HOSTNAME}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'','0','7d','0','',NULL,'','{#NODEHTTPADDRESS}/jmx','','','200','1','0','','','0','0','0','0','0','0','0','23c89dfb26a34b77bf34fcf543f719f2','0','2','0'),
('59821','15','','10308','Frontend {#PXNAME}: Session utilization','haproxy.frontend.sutil[{#PXNAME},{#SVNAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'last(//haproxy.frontend.scur[{#PXNAME},{#SVNAME}]) / last(//haproxy.frontend.slim[{#PXNAME},{#SVNAME}]) * 100','','0','','','','','2',NULL,'Percentage of sessions used (scur / slim * 100).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4aedda0904954ade92a4aad6460d759b','0','2','0'),
('59885','15','','10309','Frontend {#PXNAME}: Session utilization','haproxy.frontend.sutil[{#PXNAME},{#SVNAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'last(//haproxy.frontend.scur[{#PXNAME},{#SVNAME}]) / last(//haproxy.frontend.slim[{#PXNAME},{#SVNAME}]) * 100','','0','','','','','2',NULL,'Percentage of sessions used (scur / slim * 100).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','53efa6139fe3400283c96ec76eb20855','0','2','0'),
('59946','0','','10325','Application pools discovery','wmi.getall[root\\webAdministration, select Name from ApplicationPool]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6148952d54d54982af404c6c845ccbf2','0','2','0'),
('59947','0','','10325','AppPool {#APPPOOL} state','perf_counter_en["\\APP_POOL_WAS({#APPPOOL})\\Current Application Pool State"]','1m','31d','365d','0','3','','','','',NULL,'152','','','0','','','','','2',NULL,'The state of the application pool.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','270068fe6e6844ae9bbf993509eda7e0','0','2','0'),
('59948','0','','10325','{#APPPOOL} Uptime','perf_counter_en["\\APP_POOL_WAS({#APPPOOL})\\Current Application Pool Uptime"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'The web application uptime period since the last restart.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f039a53351d54132ab9ad046282389d8','0','2','0'),
('59949','0','','10325','AppPool {#APPPOOL} recycles','perf_counter_en["\\APP_POOL_WAS({#APPPOOL})\\Total Application Pool Recycles"]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','2',NULL,'The number of times the application pool has been recycled since Windows Process Activation Service (WAS) started.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4700b5729ca440869de976ae347598cf','0','2','0'),
('59950','0','','10325','AppPool {#APPPOOL} current queue size','perf_counter_en["\\HTTP Service Request Queues({#APPPOOL})\\CurrentQueueSize"]','30s','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','2',NULL,'The number of requests in the queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','193642cad7214206a00db4f710bfbef8','0','2','0'),
('59951','7','','10326','Application pools discovery','wmi.getall[root\\webAdministration, select Name from ApplicationPool]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1dfb7339b81b4237a4e90b29328de297','0','2','0'),
('59952','7','','10326','AppPool {#APPPOOL} state','perf_counter_en["\\APP_POOL_WAS({#APPPOOL})\\Current Application Pool State"]','1m','31d','365d','0','3','','','','',NULL,'153','','','0','','','','','2',NULL,'The state of the application pool.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','82c0636b84d84863a2051d6b708d841b','0','2','0'),
('59953','7','','10326','{#APPPOOL} Uptime','perf_counter_en["\\APP_POOL_WAS({#APPPOOL})\\Current Application Pool Uptime"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','','','','','2',NULL,'The web application uptime period since the last restart.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f0a6fe8a4cc44582a3048f1a00442736','0','2','0'),
('59954','7','','10326','AppPool {#APPPOOL} recycles','perf_counter_en["\\APP_POOL_WAS({#APPPOOL})\\Total Application Pool Recycles"]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','2',NULL,'The number of times the application pool has been recycled since Windows Process Activation Service (WAS) started.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','e2cfc77aebab4b14bf6a690dbdd0c2b1','0','2','0'),
('59955','7','','10326','AppPool {#APPPOOL} current queue size','perf_counter_en["\\HTTP Service Request Queues({#APPPOOL})\\CurrentQueueSize"]','30s','31d','365d','0','3','','','','',NULL,NULL,'','','0','','','','','2',NULL,'The number of requests in the queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d525c1c47ee2402d9635ae276a5e58ec','0','2','0'),
('59956','19','','10379','Computers discovery','jenkins.computers','1h','31d','365d','0','4','','','','',NULL,NULL,'','','1','{$JENKINS.USER}','{$JENKINS.API.TOKEN}','','','1',NULL,'','0','7d','0','',NULL,'','{$JENKINS.URL}/computer/api/json','[{"tree":"computer[description,displayName,monitorData]"}]','','200','1','0','','','0','0','0','0','0','0','0','eb3e35534745476c8b205acb88382c77','0','2','0'),
('59957','19','','10379','Jobs discovery','jenkins.jobs','1h','31d','365d','0','4','','','','',NULL,NULL,'','','1','{$JENKINS.USER}','{$JENKINS.API.TOKEN}','','','1',NULL,'','0','7d','0','',NULL,'','{$JENKINS.URL}/api/json','[{"tree":"jobs[name,description,url]"}]','','200','1','0','','','0','0','0','0','0','0','0','25949e5e452e4fa384ec4aa2088375aa','0','2','0'),
('59984','16','','10630','Storage discovery','jmx.discovery[beans,"com.atlassian.jira:type=metrics,category00=home,category01=*,category02=write,category03=latency,*,name=value"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','1',NULL,'Discovery of the Jira storage metrics.','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6b671426094e4268b48f51eb97ddd8bf','0','2','0'),
('59985','16','','10630','Indexing latency discovery','jmx.discovery[beans,"com.atlassian.jira:type=metrics,category00=indexing,name=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','1',NULL,'Discovery of the Jira indexing metrics.','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','886f8b2c518d4f3bb3d4441e29bf13fc','0','2','0'),
('59986','16','','10630','Issue latency discovery','jmx.discovery[beans,"com.atlassian.jira:type=metrics,category00=issue,name=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','1',NULL,'Discovery of the Jira issue latency metrics.','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','70db70727f824102b769a652713432ad','0','2','0'),
('59987','16','','10630','Mail server discovery','jmx.discovery[beans,"com.atlassian.jira:type=metrics,category00=mail,category01=*,category02=connection,category03=state,name=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','1',NULL,'Discovery of the Jira connected mail servers.','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','2bd3e8ce78f84ccba599137b0e0ab6a0','0','2','0'),
('59989','16','','10630','Storage [{#JMXCATEGORY01}]: Latency','jmx["{#JMXOBJ}",Value]','15m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'The median latency of writing a small file (~30 bytes) to `{#JMXCATEGORY01}`.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','933c9c8b11e848f88775ee9b54f8d292','0','2','0'),
('59990','16','','10630','Indexing [{#JMXNAME}]: Latency','jmx["com.atlassian.jira:type=metrics,category00=indexing,name={#JMXNAME}",Mean]','15m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Average time spent on indexing operations.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','2b02e3232de34ae9803f80ac94ade79c','0','2','0'),
('59991','16','','10630','Issue [{#JMXNAME}]: Latency','jmx["{#JMXOBJ}",Mean]','15m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Average time spent on issue `{#JMXNAME}` operations.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','da6d68fa14f24f58bcbe1157b9818321','0','2','0'),
('59992','16','','10630','Mail [{#JMXCATEGORY01},{#JMXNAME}]: Connection state','jmx["{#JMXOBJ}",Connected]','1m','31d','365d','0','3','','','','',NULL,'1224','','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Shows connection state of Jira to discovered mail server: `{#JMXCATEGORY01}-{#JMXNAME}`','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5281bee6b829433a875c0e026d805206','0','2','0'),
('59993','16','','10630','Mail [{#JMXCATEGORY01},{#JMXNAME}]: Failures per minute','jmx["{#JMXOBJ}",TotalFailures]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$JMX.USER}','{$JMX.PASSWORD}','','','2',NULL,'Count of failed connections to discovered mail server `{#JMXCATEGORY01}-{#JMXNAME}` per minute','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','949854436d6542f9a859a65cec20572d','0','2','0'),
('59996','16','','10364','Topic Metrics (read)','jmx.discovery[beans,"kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$KAFKA.USER}','{$KAFKA.PASSWORD}','','','1',NULL,'','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c4421eb9f9ab4bf2b6d4ba101c897ca7','0','2','0'),
('59997','16','','10364','Topic Metrics (errors)','jmx.discovery[beans,"kafka.server:type=BrokerTopicMetrics,name=BytesRejectedPerSec,topic=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$KAFKA.USER}','{$KAFKA.PASSWORD}','','','1',NULL,'','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','82037c202489462fa9c4afbb23618315','0','2','0'),
('59998','16','','10364','Topic Metrics (write)','jmx.discovery[beans,"kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$KAFKA.USER}','{$KAFKA.PASSWORD}','','','1',NULL,'','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d5ec81baadad41f29882757979443b5b','0','2','0'),
('59999','16','','10364','Kafka {#JMXTOPIC}: Bytes out per second','jmx["kafka.server:type=BrokerTopicMetrics,name=BytesOutPerSec,topic={#JMXTOPIC}","Count"]','1m','31d','365d','0','0','','Bps','','',NULL,NULL,'','','0','{$KAFKA.USER}','{$KAFKA.PASSWORD}','','','2',NULL,'The rate at which data is fetched and read from the broker by consumers (by topic).','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','42ad85334b524973afa2fd8f2a135e77','0','2','0'),
('60000','16','','10364','Kafka {#JMXTOPIC}: Bytes rejected per second','jmx["kafka.server:type=BrokerTopicMetrics,name=BytesRejectedPerSec,topic={#JMXTOPIC}","Count"]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$KAFKA.USER}','{$KAFKA.PASSWORD}','','','2',NULL,'Rejected bytes rate by topic.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','abaf2616581a46158a13a71ffcf67634','0','2','0'),
('60001','16','','10364','Kafka {#JMXTOPIC}: Bytes in per second','jmx["kafka.server:type=BrokerTopicMetrics,name=BytesInPerSec,topic={#JMXTOPIC}","Count"]','1m','31d','365d','0','0','','Bps','','',NULL,NULL,'','','0','{$KAFKA.USER}','{$KAFKA.PASSWORD}','','','2',NULL,'The rate at which data sent from producers is consumed by topic.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','61bb29999ea1465c8125b518507d9e5d','0','2','0'),
('60002','16','','10364','Kafka {#JMXTOPIC}: Messages in per second','jmx["kafka.server:type=BrokerTopicMetrics,name=MessagesInPerSec,topic={#JMXTOPIC}","Count"]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$KAFKA.USER}','{$KAFKA.PASSWORD}','','','2',NULL,'The rate at which individual messages are consumed by topic.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5c18b5eca61b4ed2ae1aae197b7c9958','0','2','0'),
('60014','15','','10504','["{#VERB}"] Requests, p50','kubernetes.api.request_duration_seconds_p50["{#VERB}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.api.request_duration_seconds_bucket[*,"{#VERB}"],5m,50)','','0','','','','','2',NULL,'50 percentile of response latency distribution in seconds for each verb.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','a4f39bb87ef248edbb578c0c89baba46','0','2','0'),
('60015','15','','10504','["{#VERB}"] Requests, p90','kubernetes.api.request_duration_seconds_p90["{#VERB}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.api.request_duration_seconds_bucket[*,"{#VERB}"],5m,90)','','0','','','','','2',NULL,'90 percentile of response latency distribution in seconds for each verb.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','12d65aff584e459586284967e570fc0a','0','2','0'),
('60016','15','','10504','["{#VERB}"] Requests, p95','kubernetes.api.request_duration_seconds_p95["{#VERB}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.api.request_duration_seconds_bucket[*,"{#VERB}"],5m,95)','','0','','','','','2',NULL,'95 percentile of response latency distribution in seconds for each verb.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','3e900f1e4cab4edba4d068f1b6759428','0','2','0'),
('60017','15','','10504','["{#VERB}"] Requests, p99','kubernetes.api.request_duration_seconds_p99["{#VERB}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.api.request_duration_seconds_bucket[*,"{#VERB}"],5m,99)','','0','','','','','2',NULL,'99 percentile of response latency distribution in seconds for each verb.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','a34c3c5f5f844c46a4d3f148cacd3fd3','0','2','0'),
('60030','15','','10505','["{#NAME}"]: Workqueue queue duration, 50p','kubernetes.controller.workqueue_queue_duration_seconds_p50["{#NAME}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.controller.queue_duration_seconds_bucket[*,"{#NAME}"],5m,50)','','0','','','','','2',NULL,'50 percentile of how long in seconds an item stays in workqueue before being requested. If there are no requests for 5 minute, item value will be discarded.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','0657d0741d5649a2b0ad87c2f39dc243','0','2','0'),
('60031','15','','10505','["{#NAME}"]: Workqueue queue duration, p90','kubernetes.controller.workqueue_queue_duration_seconds_p90["{#NAME}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.controller.queue_duration_seconds_bucket[*,"{#NAME}"],5m,90)','','0','','','','','2',NULL,'90 percentile of how long in seconds an item stays in workqueue before being requested, by queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','9f976d181b7f4776a271e683d9efd396','0','2','0'),
('60032','15','','10505','["{#NAME}"]: Workqueue queue duration, p95','kubernetes.controller.workqueue_queue_duration_seconds_p95["{#NAME}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.controller.queue_duration_seconds_bucket[*,"{#NAME}"],5m,95)','','0','','','','','2',NULL,'95 percentile of how long in seconds an item stays in workqueue before being requested, by queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','ce4b9daa161742ffb6fec0790c1dc689','0','2','0'),
('60033','15','','10505','["{#NAME}"]: Workqueue queue duration, p99','kubernetes.controller.workqueue_queue_duration_seconds_p99["{#NAME}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.controller.queue_duration_seconds_bucket[*,"{#NAME}"],5m,99)','','0','','','','','2',NULL,'99 percentile of how long in seconds an item stays in workqueue before being requested, by queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','61d5f616cc474ae3adfcbd1a15fdd607','0','2','0'),
('60034','15','','10505','["{#NAME}"]: Workqueue work duration, 50p','kubernetes.controller.workqueue_work_duration_seconds_p50["{#NAME}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.controller.duration_seconds_bucket[*,"{#NAME}"],5m,50)','','0','','','','','2',NULL,'50 percentiles of how long in seconds processing an item from workqueue takes, by queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','68efc8bc4fec458384e21b7b19db696c','0','2','0'),
('60035','15','','10505','["{#NAME}"]: Workqueue work duration, p90','kubernetes.controller.workqueue_work_duration_seconds_p90["{#NAME}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.controller.duration_seconds_bucket[*,"{#NAME}"],5m,90)','','0','','','','','2',NULL,'90 percentile of how long in seconds processing an item from workqueue takes, by queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','ff4f4b222dfd47f69b96513fed4393f5','0','2','0'),
('60036','15','','10505','["{#NAME}"]: Workqueue work duration, p95','kubernetes.controller.workqueue_work_duration_seconds_p95["{#NAME}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.controller.duration_seconds_bucket[*,"{#NAME}"],5m,95)','','0','','','','','2',NULL,'95 percentile of how long in seconds processing an item from workqueue takes, by queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','34a688601a404d63aea3a774a9f5970a','0','2','0'),
('60037','15','','10505','["{#NAME}"]: Workqueue work duration, p99','kubernetes.controller.workqueue_work_duration_seconds_p99["{#NAME}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.controller.duration_seconds_bucket[*,"{#NAME}"],5m,99)','','0','','','','','2',NULL,'99 percentile of how long in seconds processing an item from workqueue takes, by queue.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','e5b4ea49906e4a12b01757854a5766a4','0','2','0'),
('60049','15','','10506','[{#OP_TYPE}] Operations, p50','kube.kublet.runtime_ops_duration_seconds_p50["{#OP_TYPE}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kube.kublet.runtime_ops_duration_seconds_bucket[*,"{#OP_TYPE}"],5m,50)','','0','','','','','2',NULL,'50 percentile of operation latency distribution in seconds for each verb.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','3d9545d396b24ef6b87eb730ad93cda7','0','2','0'),
('60050','15','','10506','[{#OP_TYPE}] Operations, p90','kube.kublet.runtime_ops_duration_seconds_p90["{#OP_TYPE}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kube.kublet.runtime_ops_duration_seconds_bucket[*,"{#OP_TYPE}"],5m,90)','','0','','','','','2',NULL,'90 percentile of operation latency distribution in seconds for each verb.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','039a47a0b20741e79701fecb924e6a08','0','2','0'),
('60051','15','','10506','[{#OP_TYPE}] Operations, p95','kube.kublet.runtime_ops_duration_seconds_p95["{#OP_TYPE}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kube.kublet.runtime_ops_duration_seconds_bucket[*,"{#OP_TYPE}"],5m,95)','','0','','','','','2',NULL,'95 percentile of operation latency distribution in seconds for each verb.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','e846265636ac433ba2bce034aca1e394','0','2','0'),
('60052','15','','10506','[{#OP_TYPE}] Operations, p99','kube.kublet.runtime_ops_duration_seconds_p99["{#OP_TYPE}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kube.kublet.runtime_ops_duration_seconds_bucket[*,"{#OP_TYPE}"],5m,99)','','0','','','','','2',NULL,'99 percentile of operation latency distribution in seconds for each verb.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','68f17a6132dd48deb3825efd2b83b6ce','0','2','0'),
('60107','15','','10509','["{#RESULT}"]: e2e scheduling, p50','kubernetes.scheduler.e2e_scheduling_p50["{#RESULT}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.e2e_scheduling_bucket[*,"{#RESULT}"],5m,50)','','0','','','','','2',NULL,'50 percentile of e2e scheduling latency.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','b8fd5b4454484f4298e2c2b1e5c832c5','0','2','0'),
('60108','15','','10509','["{#RESULT}"]: e2e scheduling, p90','kubernetes.scheduler.e2e_scheduling_p90["{#RESULT}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.e2e_scheduling_bucket[*,"{#RESULT}"],5m,90)','','0','','','','','2',NULL,'90 percentile of e2e scheduling latency.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','01edd56cd1c94d4b80589d91349e4be5','0','2','0'),
('60109','15','','10509','["{#RESULT}"]: e2e scheduling, p95','kubernetes.scheduler.e2e_scheduling_p95["{#RESULT}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.e2e_scheduling_bucket[*,"{#RESULT}"],5m,95)','','0','','','','','2',NULL,'95 percentile of e2e scheduling latency.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','706fc27da4d34a4e9189c566c7aa96ff','0','2','0'),
('60110','15','','10509','["{#RESULT}"]: e2e scheduling, p99','kubernetes.scheduler.e2e_scheduling_p99["{#RESULT}"]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.e2e_scheduling_bucket[*,"{#RESULT}"],5m,99)','','0','','','','','2',NULL,'95 percentile of e2e scheduling latency.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','829627aeab764590b3a17e6b10c56709','0','2','0'),
('60111','15','','10509','Binding duration, p50','kubernetes.scheduler.binding_duration_p50[{#SINGLETON}]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.binding_duration[*],5m,50)','','0','','','','','2',NULL,'50 percentile of binding latency in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','5f40c030c1964ff7ab7786cee97bee81','0','2','0'),
('60112','15','','10509','Binding duration, p90','kubernetes.scheduler.binding_duration_p90[{#SINGLETON}]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.binding_duration[*],5m,90)','','0','','','','','2',NULL,'90 percentile of binding latency in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','19ba0e215a9f4e13b3079fcdaf124cc5','0','2','0'),
('60113','15','','10509','Binding duration, p95','kubernetes.scheduler.binding_duration_p95[{#SINGLETON}]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.binding_duration[*],5m,95)','','0','','','','','2',NULL,'99 percentile of binding latency in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','b24d657a1568437fac77535a80d63bc3','0','2','0'),
('60114','15','','10509','Binding duration, p99','kubernetes.scheduler.binding_duration_p99[{#SINGLETON}]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.binding_duration[*],5m,99)','','0','','','','','2',NULL,'95 percentile of binding latency in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','258d5d4b6534488a92ba29185e3ca56f','0','2','0'),
('60115','15','','10509','Scheduling algorithm duration, p50','kubernetes.scheduler.scheduling_algorithm_duration_p50[{#SINGLETON}]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.scheduling_algorithm_duration[*],5m,50)','','0','','','','','2',NULL,'50 percentile of scheduling algorithm latency in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','3df35ee6e86a424f89f51bb74cb40b9d','0','2','0'),
('60116','15','','10509','Scheduling algorithm duration, p90','kubernetes.scheduler.scheduling_algorithm_duration_p90[{#SINGLETON}]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.scheduling_algorithm_duration[*],5m,90)','','0','','','','','2',NULL,'90 percentile of scheduling algorithm latency in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','2368f2c98f3641bdbd030d94ca53a4dd','0','2','0'),
('60117','15','','10509','Scheduling algorithm duration, p95','kubernetes.scheduler.scheduling_algorithm_duration_p95[{#SINGLETON}]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.scheduling_algorithm_duration[*],5m,95)','','0','','','','','2',NULL,'95 percentile of scheduling algorithm latency in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','6ca6a2480c4343a8b9a4e6598ec86501','0','2','0'),
('60118','15','','10509','Scheduling algorithm duration, p99','kubernetes.scheduler.scheduling_algorithm_duration_p99[{#SINGLETON}]','1m','31d','365d','0','0','','s','','',NULL,NULL,'bucket_percentile(//kubernetes.scheduler.scheduling_algorithm_duration[*],5m,99)','','0','','','','','2',NULL,'99 percentile of scheduling algorithm latency in seconds.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','1','955f0989372c4f9d82ad364b09f5efea','0','2','0'),
('60238','19','','10593','Project [{#NAME}]: Get issues','mantisbt.get.issues[{#NAME}]','20m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Getting project issues.','0','7d','0','',NULL,'30s','{$MANTIS.URL}/api/rest/issues?project_id={#ID}&page_size=0','','','200','1','0','{$MANTIS.HTTP.PROXY}','Authorization: {$MANTIS.TOKEN}','0','0','0','0','0','0','0','f0064281917741aaa9b8e808509077e1','0','2','0'),
('60272','19','','10602','Nextcloud: User discovery','nextcloud.user.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'','','1','{$NEXTCLOUD.USER.NAME}','{$NEXTCLOUD.USER.PASSWORD}','','','1',NULL,'User discovery.','0','1d','1','',NULL,'10s','{$NEXTCLOUD.SCHEMA}://{$NEXTCLOUD.ADDRESS}/ocs/v1.php/cloud/users?format=json','','','200','1','0','{$NEXTCLOUD.PROXY}','OCS-APIRequest: true','0','0','0','0','0','0','0','477477630aa14dd8b3940f7b95697893','0','2','0'),
('60273','19','','10602','User "{#NEXTCLOUD.USER}": Get data','nextcloud.user.get_data[{#NEXTCLOUD.USER}]','1m','0','0','0','4','','','','',NULL,NULL,'','','1','{$NEXTCLOUD.USER.NAME}','{$NEXTCLOUD.USER.PASSWORD}','','','2',NULL,'Get common information about user','0','7d','0','',NULL,'10s','{$NEXTCLOUD.SCHEMA}://{$NEXTCLOUD.ADDRESS}/ocs/v1.php/cloud/users/{#NEXTCLOUD.USER}','[{"format":"json"}]','','200,401','1','0','{$NEXTCLOUD.PROXY}','OCS-APIRequest: true','0','0','0','0','0','0','0','78b3e2a8e7844b0ea5929dbecd8a2ed7','0','2','0'),
('60286','0','','10266','CPU utilization','proc.cpu.util[{#NGINX.NAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'The percentage of the CPU utilization by a process {#NGINX.NAME}.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','84c95c1955bf4ccaa12a060a9acdb478','0','2','0'),
('60293','7','','10639','CPU utilization','proc.cpu.util[{#NGINX.NAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'The percentage of the CPU utilization by a process {#NGINX.NAME}.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6045ce9aba4747f2a6a1475fc3f8b428','0','2','0'),
('60449','0','','10651','[{#UUID}]: Decoder utilization','nvml.device.decoder.utilization["{#UUID}"]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current utilization for the Decoder.\r\nFor Nvidia Kepler or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','cf631ee2b8d9494e81eef3e9e0bddf80','0','2','0'),
('60450','0','','10651','[{#UUID}]: Encoder stats','nvml.device.encoder.stats.get["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current encoder statistics for a given device.\r\nFor Nvidia Maxwell or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','cc4ff50ff1ed4c6d92ccb24f205b65c5','0','2','0'),
('60451','0','','10651','[{#UUID}]: Encoder utilization','nvml.device.encoder.utilization["{#UUID}"]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current utilization for the Encoder.\r\nFor Nvidia Kepler or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6cf65da338f64f6c9087f8699c2d71dc','0','2','0'),
('60452','0','','10651','[{#UUID}]: Energy consumption','nvml.device.energy.consumption["{#UUID}"]','1m','31d','365d','0','0','','J','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the total energy consumption of this GPU in joules since the last driver reload.\r\nFor Nvidia Volta or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8f992f3cffcc42d5a0f4cac878781457','0','2','0'),
('60453','0','','10651','[{#UUID}]: Memory ECC errors, get','nvml.device.errors.memory["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the GPU device memory error counters for the device.\r\nFor Nvidia Fermi or newer fully supported devices.\r\nRequires NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based memory error counts. Requires NVML_INFOROM_ECC version 1.0 or higher to report all other memory error counts.\r\nOnly applicable to devices with ECC.\r\nRequires ECC Mode to be enabled.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','e97eacb1bef64fdaa7b55883fc37a4a9','0','2','0'),
('60454','0','','10651','[{#UUID}]: Register file errors, get','nvml.device.errors.register["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the GPU register file error counters for the device.\r\nFor Nvidia Fermi or newer fully supported devices.\r\nRequires NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based memory error counts. Requires NVML_INFOROM_ECC version 1.0 or higher to report all other memory error counts.\r\nOnly applicable to devices with ECC.\r\nRequires ECC Mode to be enabled.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','07ea4aec260f4850b0c2a59610f703de','0','2','0'),
('60455','0','','10651','[{#UUID}]: Fan speed','nvml.device.fan.speed.avg["{#UUID}"]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the intended operating speed of the specified device fan.\r\nNote: The reported speed is the intended fan speed. If the fan is physically blocked and unable to spin, the output will not match the actual fan speed.\r\nFor all Nvidia discrete products with dedicated fans.\r\nThe fan speed is expressed as a percentage of the product\'s maximum noise tolerance fan speed. In certain cases, this value may exceed 100%.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','49283334edaa4aeb9d63d8f2794c23d7','0','2','0'),
('60456','0','','10651','[{#UUID}]: Graphics frequency','nvml.device.graphics.frequency["{#UUID}"]','1m','31d','365d','0','3','','Hz','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current graphics clock speed for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','77bce39e010f4d4ab5fc347aebd7e61b','0','2','0'),
('60457','0','','10651','[{#UUID}]: BAR1 memory, get','nvml.device.memory.bar1.get["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Gets Total, Available, and Used size of BAR1 memory.\r\nBAR1 is used to map the FB (device memory) so that it can be directly accessed by the CPU or 3rd party devices (peer-to-peer on the PCIE bus).\r\nFor Nvidia Kepler or newer fully supported devices','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','da9f4e0ce0af45af9cb414b34932df70','0','2','0'),
('60458','0','','10651','[{#UUID}]: FB memory, get','nvml.device.memory.fb.get["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the amount of used, free, reserved, and total memory available on the device.\r\nFor all Nvidia products.\r\nEnabling ECC reduces the amount of total available memory due to the extra required parity bits. Under WDDM, most of the device memory is allocated and managed on startup by Windows.\r\nUnder Linux and Windows TCC, the reported amount of used memory is equal to the sum of memory allocated by all active channels on the device.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','cad7ac51204847e2a00a8a594a7ffecc','0','2','0'),
('60459','0','','10651','[{#UUID}]: Memory frequency','nvml.device.memory.frequency["{#UUID}"]','1m','31d','365d','0','3','','Hz','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current memory clock speed for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','78918ce1cbae45bdb3a0773f3bf9bd14','0','2','0'),
('60460','0','','10651','[{#UUID}]: PCIe utilization, get','nvml.device.pci.utilization["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves PCIe utilization information.\r\nFor Nvidia Maxwell or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','35d9d7075294487f9bd2f47f4be66dea','0','2','0'),
('60461','0','','10651','[{#UUID}]: Performance state','nvml.device.performance.state["{#UUID}"]','1m','31d','365d','0','3','','','','',NULL,'1270','','','0','','','','','2',NULL,'Retrieves the current performance state for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5a97162894064078ad8913d647dbf76e','0','2','0'),
('60462','0','','10651','[{#UUID}]: Power limit','nvml.device.power.limit["{#UUID}"]','1h','31d','365d','0','0','','watts','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the power management limit associated with this device.\r\nFor Nvidia Fermi or newer fully supported devices.\r\nThe power limit defines the upper boundary for the card\'s power draw. If the card\'s total power draw reaches this limit, the power management algorithm kicks in.\r\nThis reading is only available if power management mode is supported.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6b99a9e1c5b841059f0e62b04001c82d','0','2','0'),
('60463','0','','10651','[{#UUID}]: Power usage','nvml.device.power.usage["{#UUID}"]','1m','31d','365d','0','0','','watts','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves power usage for this GPU (in watts) and its associated circuitry (e.g. memory).\r\nFor Nvidia Fermi or newer fully supported devices.\r\nOn Fermi and Kepler GPUs, the reading is accurate to within +/- 5% of current power draw. On Ampere (except GA100) or newer GPUs, the API returns power averaged over a 1 second interval. On GA100 and older architectures, instantaneous power is returned.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','bb1c7aee478f4ba4b108491532ccd737','0','2','0'),
('60464','0','','10651','[{#UUID}]: Serial number','nvml.device.serial["{#UUID}"]','1h','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the globally unique board serial number associated with this device\'s board.\r\nFor all products with an inforom.\r\nThis number matches the serial number tag that is physically attached to the board.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','94c121b6588d424f9573f6e1352b5cd4','0','2','0'),
('60465','0','','10651','[{#UUID}]: SM frequency','nvml.device.sm.frequency["{#UUID}"]','1m','31d','365d','0','3','','Hz','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current SM clock speed for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6e149695990a46f294361c047f288b80','0','2','0'),
('60466','0','','10651','[{#UUID}]: Temperature','nvml.device.temperature["{#UUID}"]','1m','31d','365d','0','3','','C','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current temperature readings for the device, in degrees C.\r\nFor Nvidia all products.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f47e1eed64354c7cb010dea8570c067b','0','2','0'),
('60467','0','','10651','[{#UUID}]: Device utilization, get','nvml.device.utilization["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current utilization rates for the device\'s major subsystems.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9a3e4972de4d4149bf14512be108179f','0','2','0'),
('60468','0','','10651','[{#UUID}]: Video frequency','nvml.device.video.frequency["{#UUID}"]','1m','31d','365d','0','3','','Hz','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current video encoder/decoder clock speed for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','91fc19e1784846b7afb982f7ae87439e','0','2','0'),
('60488','7','','10650','[{#UUID}]: Decoder utilization','nvml.device.decoder.utilization["{#UUID}"]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current utilization for the Decoder.\r\nFor Nvidia Kepler or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0355d8799fb44e6b8ad144b389641d01','0','2','0'),
('60489','7','','10650','[{#UUID}]: Encoder stats','nvml.device.encoder.stats.get["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current encoder statistics for a given device.\r\nFor Nvidia Maxwell or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','52c3a8fc63fc47e88c976d8d8436a3a5','0','2','0'),
('60490','7','','10650','[{#UUID}]: Encoder utilization','nvml.device.encoder.utilization["{#UUID}"]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current utilization for the Encoder.\r\nFor Nvidia Kepler or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ae76d66eed7b42fb95b13cfcc1e633d1','0','2','0'),
('60491','7','','10650','[{#UUID}]: Energy consumption','nvml.device.energy.consumption["{#UUID}"]','1m','31d','365d','0','0','','J','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the total energy consumption of this GPU in joules since the last driver reload.\r\nFor Nvidia Volta or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','79928bb18ccc4a4e9d1ed46aa20d5434','0','2','0'),
('60492','7','','10650','[{#UUID}]: Memory ECC errors, get','nvml.device.errors.memory["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the GPU device memory error counters for the device.\r\nFor Nvidia Fermi or newer fully supported devices.\r\nRequires NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based memory error counts. Requires NVML_INFOROM_ECC version 1.0 or higher to report all other memory error counts.\r\nOnly applicable to devices with ECC.\r\nRequires ECC Mode to be enabled.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','e79e45b1625742fea796f14d26c52e6f','0','2','0'),
('60493','7','','10650','[{#UUID}]: Register file errors, get','nvml.device.errors.register["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the GPU register file error counters for the device.\r\nFor Nvidia Fermi or newer fully supported devices.\r\nRequires NVML_INFOROM_ECC version 2.0 or higher to report aggregate location-based memory error counts. Requires NVML_INFOROM_ECC version 1.0 or higher to report all other memory error counts.\r\nOnly applicable to devices with ECC.\r\nRequires ECC Mode to be enabled.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3b19ff5ab2ae48049aed8403ab18ebf3','0','2','0'),
('60494','7','','10650','[{#UUID}]: Fan speed','nvml.device.fan.speed.avg["{#UUID}"]','1m','31d','365d','0','3','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the intended operating speed of the specified device fan.\r\nNote: The reported speed is the intended fan speed. If the fan is physically blocked and unable to spin, the output will not match the actual fan speed.\r\nFor all Nvidia discrete products with dedicated fans.\r\nThe fan speed is expressed as a percentage of the product\'s maximum noise tolerance fan speed. In certain cases, this value may exceed 100%.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ece478c8ff5f40dcb3bcb7a4b6d65124','0','2','0'),
('60495','7','','10650','[{#UUID}]: Graphics frequency','nvml.device.graphics.frequency["{#UUID}"]','1m','31d','365d','0','3','','Hz','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current graphics clock speed for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c9609ab9041a4f7584bed04b436315c0','0','2','0'),
('60496','7','','10650','[{#UUID}]: BAR1 memory, get','nvml.device.memory.bar1.get["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Gets Total, Available, and Used size of BAR1 memory.\r\nBAR1 is used to map the FB (device memory) so that it can be directly accessed by the CPU or 3rd party devices (peer-to-peer on the PCIE bus).\r\nFor Nvidia Kepler or newer fully supported devices','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8836f8d00eb44a5180c8ced82494c1ba','0','2','0'),
('60497','7','','10650','[{#UUID}]: FB memory, get','nvml.device.memory.fb.get["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the amount of used, free, reserved, and total memory available on the device.\r\nFor all Nvidia products.\r\nEnabling ECC reduces the amount of total available memory due to the extra required parity bits. Under WDDM, most of the device memory is allocated and managed on startup by Windows.\r\nUnder Linux and Windows TCC, the reported amount of used memory is equal to the sum of memory allocated by all active channels on the device.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1f48f586a4ec49ffbe8080bac5df66f8','0','2','0'),
('60498','7','','10650','[{#UUID}]: Memory frequency','nvml.device.memory.frequency["{#UUID}"]','1m','31d','365d','0','3','','Hz','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current memory clock speed for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b3ec856b4b7f42d9ba76c2ff47752bd7','0','2','0'),
('60499','7','','10650','[{#UUID}]: PCIe utilization, get','nvml.device.pci.utilization["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves PCIe utilization information.\r\nFor Nvidia Maxwell or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3270b9cf246b4b0abf60bb73f2c64c39','0','2','0'),
('60500','7','','10650','[{#UUID}]: Performance state','nvml.device.performance.state["{#UUID}"]','1m','31d','365d','0','3','','','','',NULL,'1269','','','0','','','','','2',NULL,'Retrieves the current performance state for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1ac19949ec11456896562f63525dcb8c','0','2','0'),
('60501','7','','10650','[{#UUID}]: Power limit','nvml.device.power.limit["{#UUID}"]','1h','31d','365d','0','0','','watts','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the power management limit associated with this device.\r\nFor Nvidia Fermi or newer fully supported devices.\r\nThe power limit defines the upper boundary for the card\'s power draw. If the card\'s total power draw reaches this limit, the power management algorithm kicks in.\r\nThis reading is only available if power management mode is supported.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7f4e87102f8042a8802088f842356522','0','2','0'),
('60502','7','','10650','[{#UUID}]: Power usage','nvml.device.power.usage["{#UUID}"]','1m','31d','365d','0','0','','watts','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves power usage for this GPU (in watts) and its associated circuitry (e.g. memory).\r\nFor Nvidia Fermi or newer fully supported devices.\r\nOn Fermi and Kepler GPUs, the reading is accurate to within +/- 5% of current power draw. On Ampere (except GA100) or newer GPUs, the API returns power averaged over a 1 second interval. On GA100 and older architectures, instantaneous power is returned.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','601901906c634f64a94831a9b44ad59e','0','2','0'),
('60503','7','','10650','[{#UUID}]: Serial number','nvml.device.serial["{#UUID}"]','1h','31d','0','0','1','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the globally unique board serial number associated with this device\'s board.\r\nFor all products with an inforom.\r\nThis number matches the serial number tag that is physically attached to the board.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','707c859524164a348d142f193fb464d6','0','2','0'),
('60504','7','','10650','[{#UUID}]: SM frequency','nvml.device.sm.frequency["{#UUID}"]','1m','31d','365d','0','3','','Hz','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current SM clock speed for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c64fafdc18654ad8adb984673142b614','0','2','0'),
('60505','7','','10650','[{#UUID}]: Temperature','nvml.device.temperature["{#UUID}"]','1m','31d','365d','0','3','','C','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current temperature readings for the device, in degrees C.\r\nFor Nvidia all products.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','513cab732c7648ccb71a7401ebcaebc5','0','2','0'),
('60506','7','','10650','[{#UUID}]: Device utilization, get','nvml.device.utilization["{#UUID}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current utilization rates for the device\'s major subsystems.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a573c6926e2b438ba124c824268bacc4','0','2','0'),
('60507','7','','10650','[{#UUID}]: Video frequency','nvml.device.video.frequency["{#UUID}"]','1m','31d','365d','0','3','','Hz','','',NULL,NULL,'','','0','','','','','2',NULL,'Retrieves the current video encoder/decoder clock speed for the device.\r\nFor Nvidia Fermi or newer fully supported devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','2cdebc61528440e58cd0df9a43851988','0','2','0'),
('60593','0','','10330','CPU utilization','proc.cpu.util[{#PHP_FPM.NAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'The percentage of the CPU utilization by a process `{#PHP_FPM.NAME}`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a709eaae52ad4128a129c618db6525d2','0','2','0'),
('60600','7','','10645','CPU utilization','proc.cpu.util[{#PHP_FPM.NAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'The percentage of the CPU utilization by a process `{#PHP_FPM.NAME}`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','65c8bd5634d84552b401c15237b74de8','0','2','0'),
('60621','19','','10517','LXC [{#NODE.NAME}/{#LXC.NAME}]: Get data','proxmox.lxc.get.data[{#LXC.ID}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Get LXC status data.','0','7d','0','',NULL,'','https://{$PVE.URL.HOST}:{$PVE.URL.PORT}/api2/json/nodes/{#NODE.NAME}/{#LXC.ID}/status/current','','','200','1','0','','Authorization: PVEAPIToken={$PVE.TOKEN.ID}={$PVE.TOKEN.SECRET}','0','0','0','0','0','0','0','58efec1a4bb94bfab59d5985d036811e','0','2','0'),
('60622','19','','10517','Node [{#NODE.NAME}]: RRD statistics','proxmox.node.rrd[{#NODE.NAME}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Read node RRD statistics.','0','7d','0','',NULL,'','https://{$PVE.URL.HOST}:{$PVE.URL.PORT}/api2/json/nodes/{#NODE.NAME}/rrddata','[{"timeframe":"hour"},{"cf":"AVERAGE"}]','','200','1','0','','Authorization: PVEAPIToken={$PVE.TOKEN.ID}={$PVE.TOKEN.SECRET}','0','0','0','0','0','0','0','fa2a60a98fd4445eadff4398ae6872bd','0','2','0'),
('60623','19','','10517','Node [{#NODE.NAME}]: Status','proxmox.node.status[{#NODE.NAME}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Read node status.','0','7d','0','',NULL,'','https://{$PVE.URL.HOST}:{$PVE.URL.PORT}/api2/json/nodes/{#NODE.NAME}/status','','','200','1','0','','Authorization: PVEAPIToken={$PVE.TOKEN.ID}={$PVE.TOKEN.SECRET}','0','0','0','0','0','0','0','c1ea4d4f83114c9b96fe81069602f060','0','2','0'),
('60624','19','','10517','Node [{#NODE.NAME}]: Time','proxmox.node.time[{#NODE.NAME}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Read server time and time zone settings.','0','7d','0','',NULL,'','https://{$PVE.URL.HOST}:{$PVE.URL.PORT}/api2/json/nodes/{#NODE.NAME}/time','','','200','1','0','','Authorization: PVEAPIToken={$PVE.TOKEN.ID}={$PVE.TOKEN.SECRET}','0','0','0','0','0','0','0','c0c03653a0af426b8f61c77cabab38a4','0','2','0'),
('60625','19','','10517','VM [{#NODE.NAME}/{#QEMU.NAME}]: Get data','proxmox.qemu.get.data[{#QEMU.ID}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Get VM status data.','0','7d','0','',NULL,'','https://{$PVE.URL.HOST}:{$PVE.URL.PORT}/api2/json/nodes/{#NODE.NAME}/{#QEMU.ID}/status/current','','','200','1','0','','Authorization: PVEAPIToken={$PVE.TOKEN.ID}={$PVE.TOKEN.SECRET}','0','0','0','0','0','0','0','a3562f2f48834a88842da612fb6f464c','0','2','0'),
('60675','0','','10300','Healthcheck: alarms in effect in the cluster{#SINGLETON}','web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.CLUSTER_HOST}:{$RABBITMQ.API.PORT}/api/health/checks/alarms{#SINGLETON}"]','1m','31d','365d','0','3','','','','',NULL,'223','','','0','','','','','2',NULL,'It responds with a status code `200 OK` if there are no alarms in effect in the cluster.\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4c93b04164d24eb8b9dbdab652afc7bc','0','2','0'),
('60676','0','','10301','Healthcheck{#SINGLETON}','web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/healthchecks/node{#SINGLETON}"]','1m','31d','365d','0','3','','','','',NULL,'134','','','0','','','','','2',NULL,'It checks whether the RabbitMQ application is running; and whether the channels and queues can be listed successfully; and that no alarms are in effect.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8b959a9d03dc4ae8bed7292973f4fcc4','0','2','0'),
('60677','0','','10301','Healthcheck: expiration date on the certificates{#SINGLETON}','web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/certificate-expiration/1/months{#SINGLETON}"]','1m','31d','365d','0','3','','','','',NULL,'134','','','0','','','','','2',NULL,'It checks the expiration date on the certificates for every listener configured to use the Transport Layer Security (TLS).\r\nIt responds with a status code `200 OK` if all the certificates are valid (have not expired).\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0f1cd729d8f4447db25e0af19eae595d','0','2','0'),
('60678','0','','10301','Healthcheck: local alarms in effect on this node{#SINGLETON}','web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/local-alarms{#SINGLETON}"]','1m','31d','365d','0','3','','','','',NULL,'134','','','0','','','','','2',NULL,'It responds with a status code `200 OK` if there are no local alarms in effect on the target node.\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','701449b128cb42cdb971fc608ba9f29b','0','2','0'),
('60679','0','','10301','Healthcheck: classic mirrored queues without synchronized mirrors online{#SINGLETON}','web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/node-is-mirror-sync-critical{#SINGLETON}"]','1m','31d','365d','0','3','','','','',NULL,'134','','','0','','','','','2',NULL,'It checks if there are classic mirrored queues without synchronized mirrors online (queues that would potentially lose data if the target node is shut down).\r\nIt responds with a status code `200 OK` if there are no such classic mirrored queues.\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7a07966d8dde4f2caa9ff95693b86974','0','2','0'),
('60680','0','','10301','Healthcheck: queues with minimum online quorum{#SINGLETON}','web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/node-is-quorum-critical{#SINGLETON}"]','1m','31d','365d','0','3','','','','',NULL,'134','','','0','','','','','2',NULL,'It checks if there are quorum queues with minimum online quorum (queues that would lose their quorum and availability if the target node is shut down).\r\nIt responds with a status code `200 OK` if there are no such quorum queues.\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f6ec1bb1cc4741be852136fac2c63333','0','2','0'),
('60681','0','','10301','Healthcheck: virtual hosts on this node{#SINGLETON}','web.page.get["{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.USER}:{$RABBITMQ.API.PASSWORD}@{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/virtual-hosts{#SINGLETON}"]','1m','31d','365d','0','3','','','','',NULL,'134','','','0','','','','','2',NULL,'It responds with It responds with a status code `200 OK` if all virtual hosts are running on the target node.\r\nOtherwise it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0d1ad3daf2bb46dba2c9913c1684a0d4','0','2','0'),
('60682','0','','10301','CPU utilization','proc.cpu.util[{#RABBITMQ.NAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','','','','','2',NULL,'The percentage of the CPU utilization by a process {#RABBITMQ.NAME}.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0b195bf594c44b1f869b4a7671f61453','0','2','0'),
('60729','19','','10302','Healthcheck: alarms in effect in the cluster{#SINGLETON}','rabbitmq.healthcheck.alarms[{#SINGLETON}]','1m','31d','365d','0','3','','','','',NULL,'224','','','1','{$RABBITMQ.API.USER}','{$RABBITMQ.API.PASSWORD}','','','2',NULL,'Responds a 200 OK if there are no alarms in effect in the cluster, otherwise responds with a 503 Service Unavailable.','0','7d','0','',NULL,'','{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.CLUSTER_HOST}:{$RABBITMQ.API.PORT}/api/health/checks/alarms','','','200,503,404','1','0','','','1','0','0','0','0','0','0','90db70de99454f7b924d84174a5951fb','0','2','0'),
('60730','19','','10303','Healthcheck{#SINGLETON}','rabbitmq.healthcheck[{#SINGLETON}]','1m','31d','365d','0','3','','','','',NULL,'135','','','1','{$RABBITMQ.API.USER}','{$RABBITMQ.API.PASSWORD}','','','2',NULL,'It checks whether the RabbitMQ application is running; and whether the channels and queues can be listed successfully; and that no alarms are in effect.','0','7d','0','',NULL,'','{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/healthchecks/node','','','200','1','0','','','0','0','0','0','0','0','0','22f9a51fd0ea41148846ecde7dbf4d99','0','2','0'),
('60731','19','','10303','Healthcheck: expiration date on the certificates{#SINGLETON}','rabbitmq.healthcheck.certificate_expiration[{#SINGLETON}]','1m','31d','365d','0','3','','','','',NULL,'135','','','1','{$RABBITMQ.API.USER}','{$RABBITMQ.API.PASSWORD}','','','2',NULL,'It checks the expiration date on the certificates for every listener configured to use the Transport Layer Security (TLS).\r\nIt responds with a status code `200 OK` if all the certificates are valid (have not expired).\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/certificate-expiration/1/months','','','200,503,404','1','0','','','1','0','0','0','0','0','0','d18cd1fd8cd749e4a00b8186fd93345f','0','2','0'),
('60732','19','','10303','Healthcheck: local alarms in effect on this node{#SINGLETON}','rabbitmq.healthcheck.local_alarms[{#SINGLETON}]','1m','31d','365d','0','3','','','','',NULL,'135','','','1','{$RABBITMQ.API.USER}','{$RABBITMQ.API.PASSWORD}','','','2',NULL,'It responds with a status code `200 OK` if there are no alarms in effect in the cluster.\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/local-alarms','','','200,503,404','1','0','','','1','0','0','0','0','0','0','e1359646453e43cbaf0b4e1b89bdcdeb','0','2','0'),
('60733','19','','10303','Healthcheck: classic mirrored queues without synchronized mirrors online{#SINGLETON}','rabbitmq.healthcheck.mirror_sync[{#SINGLETON}]','1m','31d','365d','0','3','','','','',NULL,'135','','','1','{$RABBITMQ.API.USER}','{$RABBITMQ.API.PASSWORD}','','','2',NULL,'It checks if there are classic mirrored queues without synchronized mirrors online (queues that would potentially lose data if the target node is shut down).\r\nIt responds with a status code `200 OK` if there are no such classic mirrored queues.\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/node-is-mirror-sync-critical','','','200,503,404','1','0','','','1','0','0','0','0','0','0','9867c266760a48d981caa1f34f2c3238','0','2','0'),
('60734','19','','10303','Healthcheck: queues with minimum online quorum{#SINGLETON}','rabbitmq.healthcheck.quorum[{#SINGLETON}]','1m','31d','365d','0','3','','','','',NULL,'135','','','1','{$RABBITMQ.API.USER}','{$RABBITMQ.API.PASSWORD}','','','2',NULL,'It checks if there are quorum queues with minimum online quorum (queues that would lose their quorum and availability if the target node is shut down).\r\nIt responds with a status code `200 OK` if there are no such quorum queues.\r\nOtherwise, it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/node-is-quorum-critical','','','200,503,404','1','0','','','1','0','0','0','0','0','0','972b6409c80d4ac796e5472b72ce82ae','0','2','0'),
('60735','19','','10303','Healthcheck: virtual hosts on this node{#SINGLETON}','rabbitmq.healthcheck.virtual_hosts[{#SINGLETON}]','1m','31d','365d','0','3','','','','',NULL,'135','','','1','{$RABBITMQ.API.USER}','{$RABBITMQ.API.PASSWORD}','','','2',NULL,'It responds with It responds with a status code `200 OK` if all virtual hosts are running on the target node.\r\nOtherwise it responds with a status code `503 Service Unavailable`.','0','7d','0','',NULL,'','{$RABBITMQ.API.SCHEME}://{$RABBITMQ.API.HOST}:{$RABBITMQ.API.PORT}/api/health/checks/virtual-hosts','','','200,503,404','1','0','','','1','0','0','0','0','0','0','d701b9acae86464282b308df720a1de2','0','2','0'),
('60772','21','','10382','Directory discovery','sharepoint.directory.discovery','{$SHAREPOINT.LLD_INTERVAL}','31d','365d','0','4','','','','',NULL,NULL,'try {\r\n\r\n	var params = JSON.parse(value);\r\n	var result = [];\r\n\r\n	var req = new HttpRequest();\r\n\r\n	var queue = [];\r\n\r\n	var node;\r\n	var current_folder;\r\n	var child_folders;\r\n	var child_files;\r\n\r\n	req.addHeader(\'Accept: application/json; odata=verbose\');\r\n	req.setHttpAuth(HTTPAUTH_NTLM, params.user, params.password);\r\n	queue.push({\r\n		patch: params.root,\r\n		json_query: \'$["data"]\'\r\n	});\r\n\r\n	while (queue.length) {\r\n		node = queue.pop();\r\n\r\n		current_folder = JSON.parse(req.get(encodeURI(params.url + "/_api/web/GetFolderByServerRelativeUrl(\'" + node.patch.replace("\'", "\'\'") + "\')")));\r\n\r\n		result.status = req.getStatus();\r\n		if (result.status != 200) {\r\n			throw result.status;\r\n		}\r\n\r\n		result.push({\r\n			\'{#SHAREPOINT.LLD.NAME}\': current_folder.d.Name,\r\n			\'{#SHAREPOINT.LLD.TYPE}\': \'FOLDER\',\r\n			\'{#SHAREPOINT.LLD.FULL_PATH}\': node.patch,\r\n			\'{#SHAREPOINT.LLD.JSON_PATH}\': node.json_query + \'["\' + current_folder.d.Name + \'"]\',\r\n			\'{#SHAREPOINT.LLD.SIZE}\': 0,\r\n			\'{#SHAREPOINT.LLD.CREATED}\': Math.round(new Date(current_folder.d.TimeCreated).getTime() / 1000),\r\n			\'{#SHAREPOINT.LLD.MODIFIED}\': Math.round(new Date(current_folder.d.TimeLastModified).getTime() / 1000)\r\n		});\r\n\r\n		child_folders = JSON.parse(req.get(encodeURI(params.url + "/_api/web/GetFolderByServerRelativeUrl(\'" + node.patch.replace("\'", "\'\'") + "\')/Folders")));\r\n\r\n		child_folders.d.results.forEach(function (dir) {\r\n			queue.push({\r\n				patch: dir.ServerRelativeUrl,\r\n				json_query: node.json_query + \'["\' + current_folder.d.Name + \'"]["data"]\'\r\n			});\r\n		});\r\n\r\n		child_files = JSON.parse(req.get(encodeURI(params.url + "/_api/web/GetFolderByServerRelativeUrl(\'" + node.patch.replace("\'", "\'\'") + "\')/Files")));\r\n		child_files.d.results.forEach(function (file) {\r\n			result.push({\r\n				\'{#SHAREPOINT.LLD.NAME}\': file.Name,\r\n				\'{#SHAREPOINT.LLD.TYPE}\': \'FILE\',\r\n				\'{#SHAREPOINT.LLD.FULL_PATH}\': file.ServerRelativeUrl,\r\n				\'{#SHAREPOINT.LLD.JSON_PATH}\': node.json_query + \'["\' + current_folder.d.Name + \'"]\' + \'["data"]["\' + file.Name + \'"]\',\r\n				\'{#SHAREPOINT.LLD.SIZE}\': file.Length,\r\n				\'{#SHAREPOINT.LLD.CREATED}\': Math.round(new Date(file.TimeCreated).getTime() / 1000),\r\n				\'{#SHAREPOINT.LLD.MODIFIED}\': Math.round(new Date(file.TimeLastModified).getTime() / 1000)\r\n			});\r\n		});\r\n	}\r\n\r\n} catch (error) {\r\n	Zabbix.log(3, "Sharepoint fs discovery failed: " + params.url + " Error: " + error);\r\n	return "Sharepoint fs discovery failed: " + params.url + " Error: " + error;\r\n}\r\n\r\nreturn JSON.stringify(result);','','0','','','','','1',NULL,'','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0fe7e8e5480a42b7903cb7ac9bf931cc','0','2','0'),
('60776','0','','10416','Service units discovery','systemd.unit.discovery[service]','30m','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discover systemd service units and their details.','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0dfbc5994c1e44a6a1a2aa8ecc2f0347','0','1','0'),
('60777','0','','10416','Socket units discovery','systemd.unit.discovery[socket]','30m','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Discover systemd socket units and their details.','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5c337762ae7b43a98fcb9dc3102a8467','0','1','0'),
('60778','0','','10416','{#UNIT.NAME}: Get unit info','systemd.unit.get["{#UNIT.NAME}"]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Returns all properties of a systemd service unit.\r\n Unit description: {#UNIT.DESCRIPTION}.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','bdb94d1182114985a8734de7d5d92380','0','2','0'),
('60779','0','','10416','{#UNIT.NAME}: Get unit info','systemd.unit.get["{#UNIT.NAME}",Socket]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Returns all properties of a systemd socket unit.\r\n Unit description: {#UNIT.DESCRIPTION}.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','83ffad5a484d48e388ac658511d4b803','0','2','0'),
('60786','16','','10260','Protocol handlers discovery','jmx.discovery[attributes,"Catalina:type=ProtocolHandler,port=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','1',NULL,'Discovery for ProtocolHandler','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a478be537e5f48fe95310997d0df0eda','0','2','0'),
('60787','16','','10260','Global request processors discovery','jmx.discovery[beans,"Catalina:type=GlobalRequestProcessor,name=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','1',NULL,'Discovery for GlobalRequestProcessor','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','77175f79fe844bb8bca66de437a3ba32','0','2','0'),
('60788','16','','10260','Contexts discovery','jmx.discovery[beans,"Catalina:type=Manager,host=*,context=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','1',NULL,'Discovery for contexts','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','cf1badf064714d9b9e3b7110696432f9','0','2','0'),
('60789','16','','10260','Thread pools discovery','jmx.discovery[beans,"Catalina:type=ThreadPool,name=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','1',NULL,'Discovery for ThreadPool','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','05752834671f416fb2fdac1006308c3e','0','2','0'),
('60790','16','','10260','{#JMXVALUE}: Gzip compression status','jmx[{#JMXOBJ},compression]','1m','31d','0','0','1','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Gzip compression status on {#JMXNAME}. Enabling gzip compression may save server bandwidth.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','830f58f8ad6640d989a70c01f7aa2ad8','0','2','0'),
('60791','16','','10260','{#JMXNAME}: Bytes received per second','jmx[{#JMXOBJ},bytesReceived]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Bytes received rate by processor {#JMXNAME}','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d7cb07f3f5e04792850332c416284dd9','0','2','0'),
('60792','16','','10260','{#JMXNAME}: Bytes sent per second','jmx[{#JMXOBJ},bytesSent]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Bytes sent rate by processor {#JMXNAME}','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','abad7332ed6b417c92f6038ce12ae000','0','2','0'),
('60793','16','','10260','{#JMXNAME}: Errors per second','jmx[{#JMXOBJ},errorCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Error rate of request processor {#JMXNAME}','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1596a335401d47d6b2bde7a5b0de7b07','0','2','0'),
('60794','16','','10260','{#JMXNAME}: Requests processing time','jmx[{#JMXOBJ},processingTime]','1m','31d','365d','0','3','','s','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'The total time to process all incoming requests of request processor\r\n{#JMXNAME}','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','985d3eeacd9d404385bfcef693add39a','0','2','0'),
('60795','16','','10260','{#JMXNAME}: Requests per second','jmx[{#JMXOBJ},requestCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Rate of requests served by request processor {#JMXNAME}','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8e0307b5063549dab118e0e374a62aad','0','2','0'),
('60796','16','','10260','{#JMXHOST}{#JMXCONTEXT}: Sessions active','jmx[{#JMXOBJ},activeSessions]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Active sessions of the application.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c20bb67db247471ba686d2ea371b7c73','0','2','0'),
('60797','16','','10260','{#JMXHOST}{#JMXCONTEXT}: Sessions allowed maximum','jmx[{#JMXOBJ},maxActiveSessions]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'The maximum number of active Sessions allowed, or -1 for no limit.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','bc3c2a3cff614f3eaf001463df1b2364','0','2','0'),
('60798','16','','10260','{#JMXHOST}{#JMXCONTEXT}: Sessions active maximum so far','jmx[{#JMXOBJ},maxActive]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Maximum number of active sessions so far.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fd8678e68cf440939af2dd8f3568a42f','0','2','0'),
('60799','16','','10260','{#JMXHOST}{#JMXCONTEXT}: Sessions rejected per second','jmx[{#JMXOBJ},rejectedSessions]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Rate of sessions we rejected due to maxActive being reached.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','34702e2d6b2142ec9aa43bea1059a98a','0','2','0'),
('60800','16','','10260','{#JMXHOST}{#JMXCONTEXT}: Sessions created per second','jmx[{#JMXOBJ},sessionCounter]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Rate of sessions created by this application per second.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','eb28f9bd99d440f4a50d1c24ae758029','0','2','0'),
('60801','16','','10260','{#JMXNAME}: Threads count','jmx[{#JMXOBJ},currentThreadCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Amount of threads the thread pool has right now, both busy and free.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7d7418c72ced48eca2a92e30021b611b','0','2','0'),
('60802','16','','10260','{#JMXNAME}: Threads busy','jmx[{#JMXOBJ},currentThreadsBusy]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Number of the requests that are being currently handled.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','35b1e99fbc44448083b5aad0ce1239a1','0','2','0'),
('60803','16','','10260','{#JMXNAME}: Threads limit','jmx[{#JMXOBJ},maxThreads]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$TOMCAT.USER}','{$TOMCAT.PASSWORD}','','','2',NULL,'Limit of the threads count. When currentThreadsBusy counter reaches the maxThreads limit, no more requests could be handled, and the application chokes.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','32e316ce567c4f94aecb89d9763e4d27','0','2','0'),
('60805','15','','10447','Repo [{#SLUG}]: Builds passed, %','travis.repo.builds.passed.pct[{#SLUG}]','1m','31d','365d','0','3','','%','','',NULL,NULL,'last(//travis.repo.builds.passed[{#SLUG}])/last(//travis.repo.builds.total[{#SLUG}])*100','','0','','','','','2',NULL,'Percent of passed builds in {#SLUG} repo.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0d2f2c7b23284836ad52b4ddc98dcfc8','0','2','0'),
('60806','19','','10447','Repo [{#SLUG}]: Get builds','travis.repo.get_builds[{#SLUG}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Getting builds of {#SLUG} using Travis API.','0','7d','0','',NULL,'','https://{$TRAVIS.API.URL}/repo/{#ID}/builds','[{"limit":"50"}]','','200','1','0','','Travis-API-Version: 3\r\nAuthorization: token {$TRAVIS.API.TOKEN}','0','0','0','0','0','0','0','ed33292bc0924b9c85cb54443d5aa999','0','2','0'),
('60807','19','','10447','Repo [{#SLUG}]: Get caches','travis.repo.get_caches[{#SLUG}]','1m','0','0','0','4','','','','',NULL,NULL,'','','0','','','','','2',NULL,'Getting caches of {#SLUG} using Travis API.','0','7d','0','',NULL,'','https://{$TRAVIS.API.URL}/repo/{#ID}/caches','[{"limit":"50"}]','','200','1','0','','Travis-API-Version: 3\r\nAuthorization: token {$TRAVIS.API.TOKEN}','0','0','0','0','0','0','0','2e0c047997624373a50001b8399b3d7c','0','2','0'),
('60842','15','','10518','Dataset [{#DATASET_NAME}]: Usage in %','truenas.dataset.pused[{#DATASET_NAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'last(//truenas.dataset.used[{#DATASET_NAME}]) * 100 / last(//truenas.dataset.size.total[{#DATASET_NAME}])','','0','','','','','2',NULL,'The used size of the dataset in %.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fd6b3a3ebfb041b3a9026fb1b4370ec7','0','2','0'),
('60847','15','','10518','Pool [{#POOLNAME}]: Usage in %','truenas.zpool.pused[{#POOLNAME}]','1m','31d','365d','0','0','','%','','',NULL,NULL,'last(//truenas.zpool.used[{#POOLNAME}]) * 100 / last(//truenas.zpool.size.total[{#POOLNAME}])','','0','','','','','2',NULL,'The used size of the storage pool in %.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5f972063f958463ab132b8d478092bd8','0','2','0'),
('60911','3','','10173','VMware cluster discovery','vmware.cluster.discovery[{$VMWARE.URL}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of clusters.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','16ffc933cce74cf28a6edf306aa99782','0','2','0'),
('60912','3','','10173','VMware datastore discovery','vmware.datastore.discovery[{$VMWARE.URL}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of VMware datastores.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8fb6a45cbe074b0cb6df53758e2c6623','0','2','0'),
('60913','3','','10173','VMware hypervisor discovery','vmware.hv.discovery[{$VMWARE.URL}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of hypervisors.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a5bc075e89f248e7b411d8f960897a08','0','2','0'),
('60914','3','','10173','VMware VM discovery','vmware.vm.discovery[{$VMWARE.URL}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of guest virtual machines.','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9fd559f4e88c4677a1b874634dd686f5','0','2','0'),
('60923','3','','10173','Status of [{#CLUSTER.NAME}] cluster','vmware.cluster.status[{$VMWARE.URL},{#CLUSTER.NAME}]','1m','31d','365d','0','3','','','','',NULL,'52','','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware cluster status. One of the following:\r\n- Gray: Unknown;\r\n- Green: OK;\r\n- Yellow: It might have a problem;\r\n- Red: It has a problem.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','46111f91dd564a459dbc1d396e2e6c76','0','2','0'),
('60924','3','','10173','Average read latency of the datastore [{#DATASTORE}]','vmware.datastore.read[{$VMWARE.URL},{#DATASTORE.UUID},latency]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Amount of time for a read operation from the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4b61838ba4c34e709b25081ae5b059b5','0','2','0'),
('60925','3','','10173','Average read IOPS of the datastore [{#DATASTORE}]','vmware.datastore.read[{$VMWARE.URL},{#DATASTORE.UUID},rps]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'IOPS for a read operation from the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','54c2631edeb04ef39701ad3bf03be1af','0','2','0'),
('60926','3','','10173','Free space on datastore [{#DATASTORE}] (percentage)','vmware.datastore.size[{$VMWARE.URL},{#DATASTORE.UUID},pfree]','5m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware datastore free space (percentage from the total).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','5355c401dc244bc588ccd18767577c93','0','2','0'),
('60927','3','','10173','Total size of datastore [{#DATASTORE}]','vmware.datastore.size[{$VMWARE.URL},{#DATASTORE.UUID}]','5m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware datastore space in bytes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','84f13c4fde2d4a17baaf0c8c1eb4f2c0','0','2','0'),
('60928','3','','10173','Average write latency of the datastore [{#DATASTORE}]','vmware.datastore.write[{$VMWARE.URL},{#DATASTORE.UUID},latency]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Amount of time for a write operation to the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','540cd0fbc56c4b8ea19f2ff5839ce00d','0','2','0'),
('60929','3','','10173','Average write IOPS of the datastore [{#DATASTORE}]','vmware.datastore.write[{$VMWARE.URL},{#DATASTORE.UUID},rps]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'IOPS for a write operation to the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0026edd933404faf992d08628c9ab364','0','2','0'),
('60960','3','','10366','VMware cluster discovery','vmware.cluster.discovery[{$VMWARE.URL}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of clusters.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','dc0a844c06f7456b8643f9f9672e6b8e','0','2','0'),
('60961','3','','10366','VMware datastore discovery','vmware.datastore.discovery[{$VMWARE.URL}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of VMware datastores.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3cd02594ee644dbe88bdfc4f4257ae05','0','2','0'),
('60962','3','','10366','VMware hypervisor discovery','vmware.hv.discovery[{$VMWARE.URL}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of hypervisors.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','988bb85b325449b29780eeda15c73620','0','2','0'),
('60963','3','','10366','VMware VM FQDN discovery','vmware.vm.discovery[{$VMWARE.URL}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of guest virtual machines.','0','7d','1','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a7e2f6830442433cbe515e8bd72ee0b8','0','2','0'),
('60964','3','','10174','Network device discovery','vmware.vm.net.if.discovery[{$VMWARE.URL},{$VMWARE.VM.UUID}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of all network devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','914634668bab4266bd641ee224dbc1e4','0','2','0'),
('60965','3','','10174','Disk device discovery','vmware.vm.vfs.dev.discovery[{$VMWARE.URL},{$VMWARE.VM.UUID}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of all disk devices.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b1543bdfb5a342d7ad694c87248fe173','0','2','0'),
('60966','3','','10174','Mounted filesystem discovery','vmware.vm.vfs.fs.discovery[{$VMWARE.URL},{$VMWARE.VM.UUID}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of all guest file systems.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','44ff9ef164dc4d20acf06b3368d64456','0','2','0'),
('60967','3','','10175','Datastore discovery','vmware.hv.datastore.discovery[{$VMWARE.URL},{$VMWARE.HV.UUID}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of VMware datastores.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fb7774df87994355baff7402d9fabcc2','0','2','0'),
('60969','3','','10175','Network interface discovery','vmware.hv.net.if.discovery[{$VMWARE.URL},{$VMWARE.HV.UUID}]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','1',NULL,'Discovery of VMware hypervisor network interfaces.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','cabe1fbdd4e04ef396afaa5dfd1a3423','0','2','0'),
('60972','3','','10366','Status of [{#CLUSTER.NAME}] cluster','vmware.cluster.status[{$VMWARE.URL},{#CLUSTER.NAME}]','1m','31d','365d','0','3','','','','',NULL,'54','','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware cluster status. One of the following:\r\n- Gray: Unknown;\r\n- Green: OK;\r\n- Yellow: It might have a problem;\r\n- Red: It has a problem.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','41fbb29592f9495e92d88240ce2ba7a5','0','2','0'),
('60973','3','','10366','Average read latency of the datastore [{#DATASTORE}]','vmware.datastore.read[{$VMWARE.URL},{#DATASTORE.UUID},latency]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Amount of time for a read operation from the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0ed09f26cbad4d96bea297da4215d73b','0','2','0'),
('60974','3','','10366','Average read IOPS of the datastore [{#DATASTORE}]','vmware.datastore.read[{$VMWARE.URL},{#DATASTORE.UUID},rps]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'IOPS for a read operation from the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c2687322c7914ec3b5519b73f1723aeb','0','2','0'),
('60975','3','','10366','Free space on datastore [{#DATASTORE}] (percentage)','vmware.datastore.size[{$VMWARE.URL},{#DATASTORE.UUID},pfree]','5m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware datastore free space (percentage from the total).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a2b1785fc773404e9ce69bcd868c5b88','0','2','0'),
('60976','3','','10366','Total size of datastore [{#DATASTORE}]','vmware.datastore.size[{$VMWARE.URL},{#DATASTORE.UUID}]','5m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware datastore space in bytes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','78fb4b4b0eec44a99207f8354773269d','0','2','0'),
('60977','3','','10366','Average write latency of the datastore [{#DATASTORE}]','vmware.datastore.write[{$VMWARE.URL},{#DATASTORE.UUID},latency]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Amount of time for a write operation to the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d9570c0822cc4996a7dda1ddb9426404','0','2','0'),
('60978','3','','10366','Average write IOPS of the datastore [{#DATASTORE}]','vmware.datastore.write[{$VMWARE.URL},{#DATASTORE.UUID},rps]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'IOPS for a write operation to the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a72c4a6247be4f968c1740de556732bd','0','2','0'),
('60979','3','','10174','Number of bytes received on interface [{#IFBACKINGDEVICE}]/[{#IFDESC}]','vmware.vm.net.if.in[{$VMWARE.URL},{$VMWARE.VM.UUID},{#IFNAME},bps]','1m','31d','365d','0','3','','Bps','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine network interface input statistics (bytes per second).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1a7452a0061b45b1b1904e3ff64cf49f','0','2','0'),
('60980','3','','10174','Number of packets received on interface [{#IFBACKINGDEVICE}]/[{#IFDESC}]','vmware.vm.net.if.in[{$VMWARE.URL},{$VMWARE.VM.UUID},{#IFNAME},pps]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine network interface input statistics (packets per second).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','863c3aee5d9248d48adbf86832fa6c8e','0','2','0'),
('60981','3','','10174','Number of bytes transmitted on interface [{#IFBACKINGDEVICE}]/[{#IFDESC}]','vmware.vm.net.if.out[{$VMWARE.URL},{$VMWARE.VM.UUID},{#IFNAME},bps]','1m','31d','365d','0','3','','Bps','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine network interface output statistics (bytes per second).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0993e42664a14cd7936351c55b1d64a4','0','2','0'),
('60982','3','','10174','Number of packets transmitted on interface [{#IFBACKINGDEVICE}]/[{#IFDESC}]','vmware.vm.net.if.out[{$VMWARE.URL},{$VMWARE.VM.UUID},{#IFNAME},pps]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine network interface output statistics (packets per second).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','144a2ed3f76e49af92462e0fea275ede','0','2','0'),
('60983','3','','10174','Network utilization on interface [{#IFBACKINGDEVICE}]/[{#IFDESC}]','vmware.vm.net.if.usage[{$VMWARE.URL},{$VMWARE.VM.UUID},{#IFNAME}]','1m','31d','365d','0','3','','Bps','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine network utilization (combined transmit and receive rates) during the interval.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9c3cd13576cc4c0a8972fa188f911e96','0','2','0'),
('60984','3','','10174','Average number of outstanding read requests to the disk [{#DISKDESC}]','vmware.vm.storage.readoio[{$VMWARE.URL},{$VMWARE.VM.UUID},{#DISKNAME}]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Average number of outstanding read requests to the virtual disk during the collection interval.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a4886b1072314819aaf21183949c94bb','0','2','0'),
('60985','3','','10174','Average read latency from the disk [{#DISKDESC}]','vmware.vm.storage.totalreadlatency[{$VMWARE.URL},{$VMWARE.VM.UUID},{#DISKNAME}]','1m','31d','365d','0','3','','!ms','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'The average time a read from the virtual disk takes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','172e4882d39f49d486ab5590163fdd4b','0','2','0'),
('60986','3','','10174','Average write latency to the disk [{#DISKDESC}]','vmware.vm.storage.totalwritelatency[{$VMWARE.URL},{$VMWARE.VM.UUID},{#DISKNAME}]','1m','31d','365d','0','3','','!ms','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'The average time a write to the virtual disk takes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4fe54828be084b15bb92507106756a5f','0','2','0'),
('60987','3','','10174','Average number of outstanding write requests to the disk [{#DISKDESC}]','vmware.vm.storage.writeoio[{$VMWARE.URL},{$VMWARE.VM.UUID},{#DISKNAME}]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Average number of outstanding write requests to the virtual disk during the collection interval.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a74614af101c404eb7ebec10319dca05','0','2','0'),
('60988','3','','10174','Average number of bytes read from the disk [{#DISKDESC}]','vmware.vm.vfs.dev.read[{$VMWARE.URL},{$VMWARE.VM.UUID},{#DISKNAME},bps]','1m','31d','365d','0','3','','Bps','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine disk device read statistics (bytes per second).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','bd151efc8a0b41e9b64cbf21303fc659','0','2','0'),
('60989','3','','10174','Average number of reads from the disk [{#DISKDESC}]','vmware.vm.vfs.dev.read[{$VMWARE.URL},{$VMWARE.VM.UUID},{#DISKNAME},ops]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine disk device read statistics (operations per second).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','e6248013150d4f23a0774f6cc80e8df3','0','2','0'),
('60990','3','','10174','Average number of bytes written to the disk [{#DISKDESC}]','vmware.vm.vfs.dev.write[{$VMWARE.URL},{$VMWARE.VM.UUID},{#DISKNAME},bps]','1m','31d','365d','0','3','','Bps','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine disk device write statistics (bytes per second).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','7ea68380b855460b8e51281223659661','0','2','0'),
('60991','3','','10174','Average number of writes to the disk [{#DISKDESC}]','vmware.vm.vfs.dev.write[{$VMWARE.URL},{$VMWARE.VM.UUID},{#DISKNAME},ops]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine disk device write statistics (operations per second).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8344a1066f5c4ef49894d2d18fac2339','0','2','0'),
('60992','3','','10174','Free disk space on [{#FSNAME}]','vmware.vm.vfs.fs.size[{$VMWARE.URL},{$VMWARE.VM.UUID},{#FSNAME},free]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine file system statistics (bytes).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','622e96310f9d4f54b4ed82f655fa153b','0','2','0'),
('60993','3','','10174','Free disk space on [{#FSNAME}] (percentage)','vmware.vm.vfs.fs.size[{$VMWARE.URL},{$VMWARE.VM.UUID},{#FSNAME},pfree]','1m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine file system statistics (percentage).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3103537bb1d24633a064d173b3b530f2','0','2','0'),
('60994','3','','10174','Total disk space on [{#FSNAME}]','vmware.vm.vfs.fs.size[{$VMWARE.URL},{$VMWARE.VM.UUID},{#FSNAME},total]','1h','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine total disk space (bytes).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','08d05eac03994b56867ec302a346735c','0','2','0'),
('60995','3','','10174','Used disk space on [{#FSNAME}]','vmware.vm.vfs.fs.size[{$VMWARE.URL},{$VMWARE.VM.UUID},{#FSNAME},used]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware virtual machine used disk space (bytes).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','09bb15da42464d8295d5e94b1d42cc87','0','2','0'),
('60996','3','','10175','Multipath count for datastore [{#DATASTORE}]','vmware.hv.datastore.multipath[{$VMWARE.URL},{$VMWARE.HV.UUID},{#DATASTORE.UUID}]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Number of available datastore paths.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','65e6c165c3674953b2845d4101a9a6bf','0','2','0'),
('60997','3','','10175','Average read latency of the datastore [{#DATASTORE}]','vmware.hv.datastore.read[{$VMWARE.URL},{$VMWARE.HV.UUID},{#DATASTORE.UUID},latency]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Average amount of time for a read operation from the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','259d1ff4bde143248f7ee2f7f880cb62','0','2','0'),
('60998','3','','10175','Average read IOPS of the datastore [{#DATASTORE}]','vmware.hv.datastore.read[{$VMWARE.URL},{$VMWARE.HV.UUID},{#DATASTORE.UUID},rps]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Average IOPS for a read operation from the datastore.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','1d7761e9ad0c48c1a3f6b1b48290c16b','0','2','0'),
('60999','3','','10175','Free space on datastore [{#DATASTORE}] (percentage)','vmware.hv.datastore.size[{$VMWARE.URL},{$VMWARE.HV.UUID},{#DATASTORE.UUID},pfree]','5m','31d','365d','0','0','','%','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware datastore free space (percentage from the total).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f36245398cc4460a9cb4ec741612693b','0','2','0'),
('61000','3','','10175','Total size of datastore [{#DATASTORE}]','vmware.hv.datastore.size[{$VMWARE.URL},{$VMWARE.HV.UUID},{#DATASTORE.UUID}]','5m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware datastore space in bytes.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','cc83e8f5ec08483db75482706bf01aba','0','2','0'),
('61001','3','','10175','Average write latency of the datastore [{#DATASTORE}]','vmware.hv.datastore.write[{$VMWARE.URL},{$VMWARE.HV.UUID},{#DATASTORE.UUID},latency]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Average amount of time for a write operation to the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9db980d8f5f44af5ad11a5949d80031d','0','2','0'),
('61002','3','','10175','Average write IOPS of the datastore [{#DATASTORE}]','vmware.hv.datastore.write[{$VMWARE.URL},{$VMWARE.HV.UUID},{#DATASTORE.UUID},rps]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'Average IOPS for a write operation to the datastore (milliseconds).','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4514c4ccf00142e48b243f69dee0b533','0','2','0'),
('61003','3','','10175','[{#IFNAME}] network interface speed','vmware.hv.network.linkspeed[{$VMWARE.URL},{$VMWARE.HV.UUID},{#IFNAME}]','1m','31d','365d','0','3','','bps','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware hypervisor network interface speed.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','706acba4535e4135b824d53763868a5f','0','2','0'),
('61004','3','','10175','Serial number','vmware.hv.hw.serialnumber[{$VMWARE.URL},{#VMWARE.HV.UUID}]','1h','31d','0','0','1','','','','',NULL,NULL,'','','0','{$VMWARE.USERNAME}','{$VMWARE.PASSWORD}','','','2',NULL,'VMware hypervisor serial number.','0','7d','0','',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fcd12a13f97848b78b610e86a24417b2','0','2','0'),
('61008','16','','10410','Deployments discovery','jmx.get[beans,"jboss.as.expr:deployment=*,server-group=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','1',NULL,'Discovery deployments metrics.','0','7d','1','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','3af697e56771487abee9f62e453fb0c3','0','2','0'),
('61009','16','','10410','Servers discovery','jmx.get[beans,"jboss.as:host=master,server-config=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','1',NULL,'Discovery instances in domain.','0','7d','1','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','da7f7dfad0c1440a8980693870364baa','0','2','0'),
('61010','16','','10410','WildFly deployment [{#DEPLOYMENT}]: Enabled','jmx["{#JMXOBJ}",enabled]','1m','31d','365d','0','3','','','','',NULL,'334','','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Boolean indicating whether the deployment content is currently deployed in the runtime (or should be deployed in the runtime the next time the server starts).','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','e6b1bebba5da4ce493ba7edf869c37b3','0','2','0'),
('61011','16','','10410','WildFly deployment [{#DEPLOYMENT}]: Managed','jmx["{#JMXOBJ}",managed]','1m','31d','365d','0','3','','','','',NULL,'334','','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Indicates if the deployment is managed (aka uses the ContentRepository).','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','45d729721df34ef297109b58027ca4c1','0','2','0'),
('61012','16','','10410','Server {#SERVER}: Autostart','jmx["{#JMXOBJ}",autoStart]','1m','31d','365d','0','3','','','','',NULL,'334','','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Whether or not this server should be started when the Host Controller starts.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d0938bbf20854315bd5cf17491b0ae1c','0','2','0'),
('61013','16','','10410','Server {#SERVER}: Server group','jmx["{#JMXOBJ}",group]','1m','31d','0','0','1','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The name of a server group from the domain model.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','bd544e2d41c148f993b84ca7d1aad4a9','0','2','0'),
('61014','16','','10410','Server {#SERVER}: Status','jmx["{#JMXOBJ}",status]','1m','31d','0','0','1','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The current status of the server.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','64a8a71b3d254a479ce4e5ea82f566ee','0','2','0'),
('61015','16','','10411','Deployments discovery','jmx.get[beans,"jboss.as.expr:deployment=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','1',NULL,'Discovery deployments metrics.','0','7d','1','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9dbbe152925245f8a1f3bf5c32ae49c0','0','2','0'),
('61016','16','','10411','JDBC metrics discovery','jmx.get[beans,"jboss.as:subsystem=datasources,data-source=*,statistics=jdbc"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','1',NULL,'','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8e3d5fe1a5a348169c15217bd083abf5','0','2','0'),
('61017','16','','10411','Pools metrics discovery','jmx.get[beans,"jboss.as:subsystem=datasources,data-source=*,statistics=pool"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','1',NULL,'','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f8fd6899dafb4247853bd3ed3fbabd48','0','2','0'),
('61018','16','','10411','Undertow metrics discovery','jmx.get[beans,"jboss.as:subsystem=undertow,server=*,http-listener=*"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','1',NULL,'','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0a566b1e160649cdb5fda18d3b157733','0','2','0'),
('61019','16','','10411','Deployment [{#DEPLOYMENT}]: Enabled time','jmx["{#JMXOBJ}",enabledTime]','1m','31d','365d','0','3','','unixtime','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Indicates if the deployment is managed (aka uses the ContentRepository).','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','52d99e3f76b4464fbf47271243682d05','0','2','0'),
('61020','16','','10411','Deployment [{#DEPLOYMENT}]: Enabled','jmx["{#JMXOBJ}",enabled]','1m','31d','365d','0','3','','','','',NULL,'335','','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Boolean indicating whether the deployment content is currently deployed in the runtime (or should be deployed in the runtime the next time the server starts).','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','8942cf5bc803401cac2f4d9ea943f1fe','0','2','0'),
('61021','16','','10411','Deployment [{#DEPLOYMENT}]: Managed','jmx["{#JMXOBJ}",managed]','1m','31d','365d','0','3','','','','',NULL,'335','','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Indicates if the deployment is managed (aka uses the ContentRepository).','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','f633e596ddcc4620a193243c80a6633b','0','2','0'),
('61022','16','','10411','Deployment [{#DEPLOYMENT}]: Persistent','jmx["{#JMXOBJ}",persistent]','1m','31d','365d','0','3','','','','',NULL,'335','','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Indicates if the deployment is managed (aka uses the ContentRepository).','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','498f0d31a5044b91b4aa8af621011919','0','2','0'),
('61023','16','','10411','Deployment [{#DEPLOYMENT}]: Status','jmx["{#JMXOBJ}",status]','1m','31d','0','0','1','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The current runtime status of a deployment.\r\nPossible status modes are OK, FAILED, and STOPPED.\r\nFAILED indicates a dependency is missing or a service could not start.\r\nSTOPPED indicates that the deployment was not enabled or was manually stopped.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d5dd67dc20c54ef1921da9c9a068ad29','0','2','0'),
('61024','16','','10411','{#JMX_DATA_SOURCE}: Cache access, rate','jmx["{#JMXOBJ}",PreparedStatementCacheAccessCount]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of times that the statement cache was accessed  per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6c0c0f94300148eda82224da1bc73bd1','0','2','0'),
('61025','16','','10411','{#JMX_DATA_SOURCE}: Cache add, rate','jmx["{#JMXOBJ}",PreparedStatementCacheAddCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of statements added to the statement cache per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0857fb4d2d2447a0b0dede21bb4b4bd5','0','2','0'),
('61026','16','','10411','{#JMX_DATA_SOURCE}: Cache current size','jmx["{#JMXOBJ}",PreparedStatementCacheCurrentSize]','1m','31d','365d','0','3','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of prepared and callable statements currently cached in the statement cache.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','bf368224ed444311ae1af4098c4bdb1f','0','2','0'),
('61027','16','','10411','{#JMX_DATA_SOURCE}: Cache delete, rate','jmx["{#JMXOBJ}",PreparedStatementCacheDeleteCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of statements discarded from the cache per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9c08f05299774a538a52be2c11e62cda','0','2','0'),
('61028','16','','10411','{#JMX_DATA_SOURCE}: Cache hit, rate','jmx["{#JMXOBJ}",PreparedStatementCacheHitCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of times that statements from the cache were used per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','dbe7bc3d9a8a46c6a84b956f0a9e33be','0','2','0'),
('61029','16','','10411','{#JMX_DATA_SOURCE}: Cache miss, rate','jmx["{#JMXOBJ}",PreparedStatementCacheMissCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of times that a statement request could not be satisfied with a statement from the cache per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0e81a30b802941c4bc0e34a10a8d0573','0','2','0'),
('61030','16','','10411','{#JMX_DATA_SOURCE}: Statistics enabled','jmx["{#JMXOBJ}",statisticsEnabled, "JDBC"]','1m','31d','365d','0','3','','','','',NULL,'335','','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Define whether runtime statistics are enabled or not.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','81dbce02ad4d492ebebd1a205bea1b43','0','2','0'),
('61031','16','','10411','{#JMX_DATA_SOURCE}: Connections: Active','jmx["{#JMXOBJ}",ActiveCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of open connections.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','06d61e390b0e403e81b1eaa77815cde2','0','2','0'),
('61032','16','','10411','{#JMX_DATA_SOURCE}: Connections: Available','jmx["{#JMXOBJ}",AvailableCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The available count.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','64565b71c26b463d8ea83ee5ee18284f','0','2','0'),
('61033','16','','10411','{#JMX_DATA_SOURCE}: Blocking time, avg','jmx["{#JMXOBJ}",AverageBlockingTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Average Blocking Time for pool.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','adf534b46aba4f28acea58ea46197edd','0','2','0'),
('61034','16','','10411','{#JMX_DATA_SOURCE}: Connections: Creating time, avg','jmx["{#JMXOBJ}",AverageCreationTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time spent creating a physical connection.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','788691ba487e422a913d408361f99e4d','0','2','0'),
('61035','16','','10411','{#JMX_DATA_SOURCE}: Connections: Get time, avg','jmx["{#JMXOBJ}",AverageGetTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time spent obtaining a physical connection.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','52320ebbe70244e3ad52b0766cd03d8d','0','2','0'),
('61036','16','','10411','{#JMX_DATA_SOURCE}: Connections: Pool time, avg','jmx["{#JMXOBJ}",AveragePoolTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time for a physical connection spent in the pool.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c3a313b3d1c34e6b99ae73d5195e7fac','0','2','0'),
('61037','16','','10411','{#JMX_DATA_SOURCE}: Connections: Usage time, avg','jmx["{#JMXOBJ}",AverageUsageTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time spent using a physical connection','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a76602ba784a4d40a3672a80487c878a','0','2','0'),
('61038','16','','10411','{#JMX_DATA_SOURCE}: Connections: Blocking failure, rate','jmx["{#JMXOBJ}",BlockingFailureCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of failures trying to obtain a physical connection per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ba111d0ad76848c39c54ffc37d04e561','0','2','0'),
('61039','16','','10411','{#JMX_DATA_SOURCE}: Connections: Created, rate','jmx["{#JMXOBJ}",CreatedCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The created per second','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c01eb89708224899a9ac8e90ee79bcca','0','2','0'),
('61040','16','','10411','{#JMX_DATA_SOURCE}: Connections: Destroyed, rate','jmx["{#JMXOBJ}",DestroyedCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The destroyed count.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','606ed51ce8e549c7af20d7c1c5f78e6e','0','2','0'),
('61041','16','','10411','{#JMX_DATA_SOURCE}: Connections: Idle','jmx["{#JMXOBJ}",IdleCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of physical connections currently idle.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a02eb0060fbb4f598d654d93c286c543','0','2','0'),
('61042','16','','10411','{#JMX_DATA_SOURCE}: Connections: In use','jmx["{#JMXOBJ}",InUseCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of physical connections currently in use.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a5eed78c02274f6180eb667091087ce0','0','2','0'),
('61043','16','','10411','{#JMX_DATA_SOURCE}: Connections: Used, max','jmx["{#JMXOBJ}",MaxUsedCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The maximum number of connections used.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','2f3e82a1c2f2472f95e4a85e3b182739','0','2','0'),
('61044','16','','10411','{#JMX_DATA_SOURCE}: Statistics enabled','jmx["{#JMXOBJ}",statisticsEnabled]','1m','31d','365d','0','0','','','','',NULL,'335','','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'Define whether runtime statistics are enabled or not.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','fb9a55168c8a4082a19f846ca10adc85','0','2','0'),
('61045','16','','10411','{#JMX_DATA_SOURCE}: Connections: Timed out, rate','jmx["{#JMXOBJ}",TimedOut]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The timed out connections per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','727ff33cec8e4223bc5054c53d0de88b','0','2','0'),
('61046','16','','10411','{#JMX_DATA_SOURCE}: Connections: Wait','jmx["{#JMXOBJ}",WaitCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of requests that had to wait to obtain a physical connection.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4832c8d39e0d4329af6876c594a3d741','0','2','0'),
('61047','16','','10411','{#JMX_DATA_SOURCE}: XA: Commit time, avg','jmx["{#JMXOBJ}",XACommitAverageTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time for a XAResource commit invocation.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c22389aa983a4cdca504e3cc41126f03','0','2','0'),
('61048','16','','10411','{#JMX_DATA_SOURCE}: XA: Commit, rate','jmx["{#JMXOBJ}",XACommitCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of XAResource commit invocations per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','2510b507e62c4574af32bb0a283995e8','0','2','0'),
('61049','16','','10411','{#JMX_DATA_SOURCE}: XA: End time, avg','jmx["{#JMXOBJ}",XAEndAverageTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time for a XAResource end invocation.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','6f15c885d49e4c1a89bd52b0b4ff0035','0','2','0'),
('61050','16','','10411','{#JMX_DATA_SOURCE}: XA: End, rate','jmx["{#JMXOBJ}",XAEndCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of XAResource end invocations per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','c51dd8821ace4724ae965d7ca6f3ebdd','0','2','0'),
('61051','16','','10411','{#JMX_DATA_SOURCE}: XA: Forget time, avg','jmx["{#JMXOBJ}",XAForgetAverageTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time for a XAResource forget invocation.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b5028a44fa2b4347abe11177d61567e2','0','2','0'),
('61052','16','','10411','{#JMX_DATA_SOURCE}: XA: Forget, rate','jmx["{#JMXOBJ}",XAForgetCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of XAResource forget invocations per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','685173455b424a5aa5463670c1718314','0','2','0'),
('61053','16','','10411','{#JMX_DATA_SOURCE}: XA: Prepare time, avg','jmx["{#JMXOBJ}",XAPrepareAverageTime]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time for a XAResource prepare invocation.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','4513aff93c8a404389aaf58b28aab5b1','0','2','0'),
('61054','16','','10411','{#JMX_DATA_SOURCE}: XA: Prepare, rate','jmx["{#JMXOBJ}",XAPrepareCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of XAResource prepare invocations per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','96c723883cfa416b9e030e5d42836de3','0','2','0'),
('61055','16','','10411','{#JMX_DATA_SOURCE}: XA: Recover time, avg','jmx["{#JMXOBJ}",XARecoverAverageTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time for a XAResource recover invocation.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','30f0474a666547c39e0d793decd0be57','0','2','0'),
('61056','16','','10411','{#JMX_DATA_SOURCE}: XA: Recover, rate','jmx["{#JMXOBJ}",XARecoverCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of XAResource recover invocations per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','d7a3de25f6a74c75b65bc9c83decc1ac','0','2','0'),
('61057','16','','10411','{#JMX_DATA_SOURCE}: XA: Rollback time, avg','jmx["{#JMXOBJ}",XARollbackAverageTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time for a XAResource rollback invocation.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','bd64f91e953249e993c3c388f3382ff4','0','2','0'),
('61058','16','','10411','{#JMX_DATA_SOURCE}: XA: Rollback, rate','jmx["{#JMXOBJ}",XARollbackCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of XAResource rollback invocations per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','0c0749b041124e1ebb11396344517c01','0','2','0'),
('61059','16','','10411','{#JMX_DATA_SOURCE}: XA: Start time, avg','jmx["{#JMXOBJ}",XAStartAverageTime]','1m','31d','365d','0','0','','s','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The average time for a XAResource start invocation.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ab9c32db31d84a46967c1f601f11f610','0','2','0'),
('61060','16','','10411','{#JMX_DATA_SOURCE}: XA: Start rate','jmx["{#JMXOBJ}",XAStartCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of XAResource start invocations per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','ef5b00e1dcab4addbc72a0c191e3728b','0','2','0'),
('61061','16','','10411','Listener {#HTTP_LISTENER}: Bytes received, rate','jmx["{#JMXOBJ}",bytesReceived]','1m','31d','365d','0','0','','Bps','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of bytes that have been received by this listener per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','dde94dd2df61495582234d709552fe17','0','2','0'),
('61062','16','','10411','Listener {#HTTP_LISTENER}: Bytes sent, rate','jmx["{#JMXOBJ}",bytesSent]','1m','31d','365d','0','0','','Bps','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of bytes that have been sent out on this listener per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','36451d29d7074b8ebdb3f366eeaa84df','0','2','0'),
('61063','16','','10411','Listener {#HTTP_LISTENER}: Errors, rate','jmx["{#JMXOBJ}",errorCount]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of 500 responses that have been sent by this listener per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','a34cb42c703a4996ab9a4c7a08e71eeb','0','2','0'),
('61064','16','','10411','Listener {#HTTP_LISTENER}: Requests, rate','jmx["{#JMXOBJ}",requestCount]','1m','31d','365d','0','0','','Rps','','',NULL,NULL,'','','0','{$WILDFLY.USER}','{$WILDFLY.PASSWORD}','','','2',NULL,'The number of requests this listener has served per second.','0','7d','0','service:jmx:{$WILDFLY.JMX.PROTOCOL}://{HOST.CONN}:{HOST.PORT}',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','2e7a581b104a4d4a8a0d9235b899635a','0','2','0'),
('61176','19','','10369','Clients discovery','zookeeper.clients','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Get list of client connections.\r\nNote, depending on the number of client connections this operation may be expensive (i.e. impact server performance).','0','7d','0','',NULL,'','{$ZOOKEEPER.SCHEME}://{$ZOOKEEPER.HOST}:{$ZOOKEEPER.PORT}/{$ZOOKEEPER.COMMAND_URL}/connections','','','200','1','0','','','0','0','0','0','0','0','0','e0f576ea5ae44289866fb726079ddbf8','0','2','0'),
('61191','19','','10380','PTZ discovery','hikvision_cam.ptz.discovery','1d','31d','365d','0','4','','','','',NULL,NULL,'','','4','{$USER}','{$PASSWORD}','','','1',NULL,'','0','7d','0','',NULL,'','http://{$HIKVISION_ISAPI_HOST}:{$HIKVISION_ISAPI_PORT}/ISAPI/PTZCtrl/channels','','','200,401','1','0','','','0','0','0','0','0','0','0','00647c38d30d44378bdcf573178063ec','0','2','0'),
('61192','19','','10380','Streaming channels discovery','hikvision_cam.streaming.discovery','1d','31d','365d','0','4','','','','',NULL,NULL,'','','4','{$USER}','{$PASSWORD}','','','1',NULL,'','0','7d','1','',NULL,'','http://{$HIKVISION_ISAPI_HOST}:{$HIKVISION_ISAPI_PORT}/ISAPI/Streaming/channels','','','200,401','1','0','','','0','0','0','0','0','0','0','0bf00b49acd448ddbd1f4fac7630c40e','0','2','0'),
('61193','19','','10380','Channel "{#PTZ_CHANNEL_ID}": Get PTZ info','hikvision_cam.get_ptz[{#PTZ_CHANNEL_ID}]','1m','0','0','0','4','','','','',NULL,NULL,'','','4','{$USER}','{$PASSWORD}','','','2',NULL,'High precision positioning which is accurate to a bit after the decimal point','0','7d','0','',NULL,'','http://{$HIKVISION_ISAPI_HOST}:{$HIKVISION_ISAPI_PORT}/ISAPI/PTZCtrl/channels/{#PTZ_CHANNEL_ID}/status','','','200,401','1','0','','','0','0','0','0','0','0','0','6799d99ad02743a1b294b80bbed52280','0','2','0'),
('61213','21','','10535','EC2 instances discovery','aws.ec2.discovery','12h','31d','365d','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload)), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'describe_region\', \'region_match\', \'region_not_match\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			canonical_uri = \'/\',\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'x-amz-content-sha256:\' + sha256(data));\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS EC2 ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS EC2 ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	tagToNameInstances: function (instance) {\r\n		try {\r\n			var tags = AWS.getField(instance, \'tagSet.item\'),\r\n				instanceName = AWS.getField(instance, \'instanceId\');\r\n			if (!Array.isArray(tags))\r\n				tags = [tags]\r\n			tags.forEach(\r\n				function (tag) {\r\n					if (String(AWS.getField(tag, \'key\')) === \'Name\') {\r\n						instanceName = AWS.getField(tag, \'value\');\r\n					}\r\n				}\r\n			);\r\n			return instanceName;\r\n		}\r\n		catch (error) {\r\n			return AWS.getField(instance, \'instanceId\');\r\n		}\r\n	},\r\n\r\n	listRegions: function () {\r\n		var payload = {\r\n			\'Action\': \'DescribeRegions\',\r\n			\'Version\': \'2016-11-15\'\r\n		};\r\n\r\n		regions = AWS.getField(AWS.request(\'GET\', AWS.params.describe_region, \'ec2\', AWS.prepareParams(payload)), \'DescribeRegionsResponse.regionInfo.item\');\r\n\r\n		if (!Array.isArray(regions))\r\n			regions = [regions]\r\n		return regions\r\n	},\r\n\r\n	listInstances: function () {\r\n		var lld_array = [],\r\n			regions = AWS.listRegions(),\r\n			payload = {\r\n				\'Action\': \'DescribeInstances\',\r\n				\'Version\': \'2016-11-15\'\r\n			};\r\n\r\n		regions.forEach(function (region) {\r\n			var region_name = AWS.getField(region, \'regionName\');\r\n			if (region_name.match(AWS.params.region_match) === null ||\r\n				region_name.match(AWS.params.region_not_match) !== null)\r\n				return;\r\n\r\n			result = AWS.request(\'GET\', region_name, \'ec2\', AWS.prepareParams(payload), \'\');\r\n\r\n			if (typeof result !== \'object\'\r\n				|| typeof result.DescribeInstancesResponse !== \'object\'\r\n				|| typeof result.DescribeInstancesResponse.reservationSet !== \'object\') {\r\n				throw \'Cannot get EC2 instance list from AWS API. Check debug log for more information.\';\r\n			}\r\n\r\n			if (result.DescribeInstancesResponse.reservationSet === null)\r\n				return [];\r\n\r\n			if (typeof result.DescribeInstancesResponse.reservationSet.item !== \'object\')\r\n				throw \'Cannot get EC2 instance list from AWS API. Check debug log for more information.\';\r\n\r\n			var reservation = result.DescribeInstancesResponse.reservationSet.item\r\n			if (!Array.isArray(reservation))\r\n				reservation = [reservation]\r\n\r\n			reservation.forEach(function (res_item) {\r\n				var instances = AWS.getField(res_item, \'instancesSet.item\')\r\n				if (!Array.isArray(instances))\r\n					instances = [instances]\r\n				instances.forEach(function (instance) {\r\n					if (AWS.getField(instance, \'instanceState.name\') === \'terminated\') return;\r\n					lld_array.push(\r\n						{\r\n							instanceId: AWS.getField(instance, \'instanceId\'),\r\n							instanceName: AWS.tagToNameInstances(instance),\r\n							instanceRegion: region_name\r\n						}\r\n					)\r\n				});\r\n			});\r\n		});\r\n\r\n		return lld_array;\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.listInstances());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS EC2 ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','1',NULL,'Get EC2 instances.','0','7d','1','',NULL,'{$AWS.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','c651911bad9244ad9c8d2dad5b0d70e4','0','2','0'),
('61214','21','','10535','ECS clusters discovery','aws.ecs.discovery','12h','31d','365d','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload)), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'describe_region\', \'region_match\', \'region_not_match\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			canonical_uri = \'/\',\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'x-amz-content-sha256:\' + sha256(data));\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/x-www-form-urlencoded\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS ECS ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS ECS ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n\r\n	},\r\n\r\n	listRegions: function () {\r\n		var payload = {\r\n			\'Action\': \'DescribeRegions\',\r\n			\'Version\': \'2016-11-15\'\r\n		};\r\n\r\n		regions = AWS.getField(AWS.request(\'GET\', AWS.params.describe_region, \'ec2\', AWS.prepareParams(payload)), \'DescribeRegionsResponse.regionInfo.item\');\r\n\r\n		if (!Array.isArray(regions))\r\n			regions = [regions]\r\n\r\n		return regions\r\n	},\r\n\r\n	listClusters: function () {\r\n		var data = [],\r\n			regions = AWS.listRegions(),\r\n			result,\r\n			ECSClusters,\r\n			payload = {\r\n				\'Action\': \'ListClusters\',\r\n				\'Version\': \'2014-11-13\'\r\n			};\r\n\r\n		regions.forEach(function (region) {\r\n			var region_name = AWS.getField(region, \'regionName\');\r\n			if (region_name.match(AWS.params.region_match) === null ||\r\n				region_name.match(AWS.params.region_not_match) !== null)\r\n				return;\r\n\r\n			result = AWS.request(\'GET\', region_name, \'ecs\', AWS.prepareParams(payload));\r\n			ECSClusters = AWS.getField(result, \'ListClustersResponse.ListClustersResult.clusterArns\')\r\n			for (k in ECSClusters) {\r\n				clusters = ECSClusters[k];\r\n				json = {};\r\n				input = clusters.split(\'/\');\r\n				for (var i = 1; i < input.length; i += 2) {\r\n					json[input[i]] = input[i + 1];\r\n				}\r\n				data.push({\r\n					\'clusters_name\': input[1],\r\n					\'region\': region_name\r\n				});\r\n			}\r\n		});\r\n\r\n		return data;\r\n	},\r\n\r\n	decribeClusters: function (cluster_name, region_name) {\r\n		var payload = {\r\n			\'Action\': \'DescribeClusters\',\r\n			\'Version\': \'2014-11-13\',\r\n			\'clusters.clusterName\': cluster_name,\r\n			\'include.statistics\': \'STATISTICS\'\r\n		};\r\n		result = AWS.request(\'GET\', region_name, \'ecs\', AWS.prepareParams(payload));\r\n\r\n		return result;\r\n\r\n	}\r\n\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n	var clusters = AWS.listClusters(),\r\n		infrastructure = [],\r\n		metrics = [\'runningEC2TasksCount\', \'pendingEC2TasksCount\', \'activeEC2ServiceCount\', \'drainingEC2ServiceCount\'],\r\n		ECSClusters = [],\r\n		DescribeClusters = [];\r\n	DescribeClusters = clusters.map(function (cluster) {\r\n		ECSClusters = AWS.getField(AWS.decribeClusters(cluster.clusters_name, cluster.region), \'DescribeClustersResponse.DescribeClustersResult.clusters\')\r\n		for (k in ECSClusters) {\r\n			var ECS2 = 0;\r\n			statistic = AWS.getField(ECSClusters[k], \'statistics\');\r\n			statistic.forEach(function (id) {\r\n				for (i in metrics) {\r\n					if (AWS.getField(id, \'name\') === metrics[i]) {\r\n						ECS2 += Number(AWS.getField(id, \'value\'));\r\n					}\r\n				}\r\n			})\r\n			infrastructure = (ECS2 > 0) ? \'use_ecs2\' : \'serverless\';\r\n\r\n			return {\r\n				\'clusterName\': ECSClusters[k].clusterName,\r\n				\'status\': ECSClusters[k].status,\r\n				\'infrastructure\': infrastructure,\r\n				\'region\': cluster.region\r\n			}\r\n\r\n		}\r\n	})\r\n\r\n	return JSON.stringify(DescribeClusters);\r\n\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS ECS ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','1',NULL,'Get ECS clusters.','0','7d','1','',NULL,'{$AWS.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','44b68894d68c45ec9a5ea787c975ae16','0','2','0'),
('61215','21','','10535','ELB load balancers discovery','aws.elb.discovery','12h','31d','365d','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload)), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'describe_region\', \'region_match\', \'region_not_match\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			canonical_uri = \'/\',\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'x-amz-content-sha256:\' + sha256(data));\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS ELB ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS ELB ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	listRegions: function () {\r\n		var payload = {\r\n			\'Action\': \'DescribeRegions\',\r\n			\'Version\': \'2016-11-15\'\r\n		};\r\n\r\n		regions = AWS.getField(AWS.request(\'GET\', AWS.params.describe_region, \'ec2\', AWS.prepareParams(payload)), \'DescribeRegionsResponse.regionInfo.item\');\r\n\r\n		if (!Array.isArray(regions))\r\n			regions = [regions]\r\n		return regions\r\n	},\r\n\r\n	listLoadBalancers: function () {\r\n		var lld_array = [],\r\n			regions = AWS.listRegions(),\r\n			payload = {\r\n				\'Action\': \'DescribeLoadBalancers\',\r\n				\'Version\': \'2015-12-01\'\r\n			};\r\n\r\n		regions.forEach(function (region) {\r\n			var region_name = AWS.getField(region, \'regionName\');\r\n			if (region_name.match(AWS.params.region_match) === null ||\r\n				region_name.match(AWS.params.region_not_match) !== null)\r\n				return;\r\n			elb = AWS.getField(AWS.request(\'GET\', region_name, \'elasticloadbalancing\', AWS.prepareParams(payload)), \'DescribeLoadBalancersResponse.DescribeLoadBalancersResult.LoadBalancers\');\r\n			if (!Array.isArray(elb))\r\n				elb = [elb]\r\n\r\n			elb.forEach(function (elb) {\r\n				lld_array.push(\r\n					{\r\n						name: AWS.getField(elb, \'LoadBalancerName\'),\r\n						arn: AWS.getField(elb, \'LoadBalancerArn\'),\r\n						type: AWS.getField(elb, \'Type\'),\r\n						state: AWS.getField(elb, \'State.Code\'),\r\n						dns_name: AWS.getField(elb, \'DNSName\'),\r\n						region: region_name\r\n					}\r\n				)\r\n			});\r\n		});\r\n\r\n		return lld_array;\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.listLoadBalancers());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS ELB ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','1',NULL,'Get ELB load balancers.','0','7d','1','',NULL,'{$AWS.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','e7ac860c53bf403f9aee8cdd4b099c05','0','2','0'),
('61216','21','','10535','Lambda discovery','aws.lambda.discovery','12h','31d','365d','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload), \'\', \'\'), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'describe_region\', \'region_match\', \'region_not_match\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data, uri) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			canonical_uri = \'/\' + uri,\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'x-amz-content-sha256:\' + sha256(data));\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS Lambda ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS Lambda ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	listRegions: function () {\r\n		var payload = {\r\n			\'Action\': \'DescribeRegions\',\r\n			\'Version\': \'2016-11-15\'\r\n		};\r\n\r\n		regions = AWS.getField(AWS.request(\'GET\', AWS.params.describe_region, \'ec2\', AWS.prepareParams(payload), \'\', \'\'), \'DescribeRegionsResponse.regionInfo.item\');\r\n\r\n		if (!Array.isArray(regions))\r\n			regions = [regions]\r\n\r\n		return regions\r\n	},\r\n\r\n	listFunctions: function () {\r\n		var lldArray = [],\r\n			regions = AWS.listRegions();\r\n		payload = {\r\n			\'FunctionVersion\': \'ALL\',\r\n			\'MaxItems\': \'10000\'\r\n		};\r\n\r\n		regions.forEach(function (region) {\r\n			var region_name = AWS.getField(region, \'regionName\');\r\n			if (region_name.match(AWS.params.region_match) === null ||\r\n				region_name.match(AWS.params.region_not_match) !== null)\r\n				return;\r\n			lambdaFunction = AWS.getField(AWS.request(\'GET\', region_name, \'lambda\', AWS.prepareParams(payload), \'\', \'2015-03-31/functions\'), \'Functions\');\r\n			if (!Array.isArray(lambdaFunction))\r\n				lambdaFunction = [lambdaFunction]\r\n\r\n			lambdaFunction.forEach(function (lambdaFunction) {\r\n				lldArray.push(\r\n					{\r\n						name: AWS.getField(lambdaFunction, \'FunctionName\'),\r\n						arn: AWS.getField(lambdaFunction, \'FunctionArn\'),\r\n						runtime: AWS.getField(lambdaFunction, \'Runtime\'),\r\n						version: AWS.getField(lambdaFunction, \'Version\'),\r\n						region: region_name\r\n					}\r\n				)\r\n			});\r\n		});\r\n\r\n		return lldArray;\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.listFunctions());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS Lambda ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','1',NULL,'Get Lambda functions.','0','7d','1','',NULL,'{$AWS.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','691d96408dbc4c5c9235932cdbe70648','0','2','0'),
('61217','21','','10535','RDS instances discovery','aws.rds.discovery','12h','31d','365d','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload)), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'describe_region\', \'region_match\', \'region_not_match\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			canonical_uri = \'/\',\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'x-amz-content-sha256:\' + sha256(data));\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS RDS ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS RDS ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	listRegions: function () {\r\n		var payload = {\r\n			\'Action\': \'DescribeRegions\',\r\n			\'Version\': \'2016-11-15\'\r\n		};\r\n\r\n		regions = AWS.getField(AWS.request(\'GET\', AWS.params.describe_region, \'ec2\', AWS.prepareParams(payload)), \'DescribeRegionsResponse.regionInfo.item\');\r\n\r\n		if (!Array.isArray(regions))\r\n			regions = [regions]\r\n		return regions\r\n	},\r\n\r\n	listInstances: function () {\r\n		var lld_array = [],\r\n			regions = AWS.listRegions(),\r\n			payload = {\r\n				\'Action\': \'DescribeDBInstances\',\r\n				\'Version\': \'2014-10-31\'\r\n			};\r\n\r\n		regions.forEach(function (region) {\r\n			var region_name = AWS.getField(region, \'regionName\');\r\n			if (region_name.match(AWS.params.region_match) === null ||\r\n				region_name.match(AWS.params.region_not_match) !== null)\r\n				return;\r\n\r\n			result = AWS.request(\'GET\', region_name, \'rds\', AWS.prepareParams(payload));\r\n\r\n			databases = AWS.getField(result, \'DescribeDBInstancesResponse.DescribeDBInstancesResult.DBInstances\')\r\n			if (!Array.isArray(databases))\r\n				databases = [databases]\r\n\r\n			databases.forEach(function (db) {\r\n				lld_array.push(\r\n					{\r\n						DBInstanceIdentifier: AWS.getField(db, \'DBInstanceIdentifier\'),\r\n						instanceRegion: region_name\r\n					}\r\n				)\r\n			});\r\n		});\r\n\r\n		return lld_array;\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.listInstances());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS RDS ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','1',NULL,'Get RDS instances.','0','7d','1','',NULL,'{$AWS.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','c1127e674b7548b2802cd8771f3a4768','0','2','0'),
('61218','21','','10535','S3 buckets discovery','aws.s3.discovery','12h','31d','365d','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload)), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'request_region\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			canonical_uri = \'/\',\r\n			host = service + \'.\' + region + \'.amazonaws.com\';\r\n\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			token = AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken;\r\n			var canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\' + \'x-amz-security-token:\' + token + \'\\n\',\r\n				signed_headers = \'content-encoding;host;x-amz-date;x-amz-security-token\';\r\n		}\r\n		else {\r\n			var canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n				signed_headers = \'content-encoding;host;x-amz-date\';\r\n		}\r\n\r\n		var canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'x-amz-content-sha256:\' + sha256(data));\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + token);\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS S3 ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS S3 ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	listBuckets: function () {\r\n		var payload = {\r\n			\'Action\': \'ListBuckets\',\r\n			\'Version\': \'2006-03-01\'\r\n		};\r\n\r\n		var result = AWS.getField(AWS.request(\'GET\', AWS.params.request_region, \'s3\', AWS.prepareParams(payload)), \'ListAllMyBucketsResult.Buckets\');\r\n\r\n		if (result === null) {\r\n			return [];\r\n		}\r\n		result = AWS.getField(result, \'Bucket\');\r\n\r\n		return Array.isArray(result) ? result : [result];\r\n\r\n	}\r\n\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.listBuckets());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS S3 ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','1',NULL,'Get S3 bucket instances.','0','7d','1','',NULL,'{$AWS.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','ab6a97a108fb4dbc9fd1e07378721ffe','0','2','0'),
('61239','21','','10527','[{#VOLUME_ID}]: Get metrics','aws.ec2.get_ebs_metrics["{#VOLUME_ID}"]','0s;m/5','0','0','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	request_period: 600,\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload), \'\'), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'region\', \'volume_id\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareRecursive: function (prefix, param) {\r\n		var result = {};\r\n\r\n		if (typeof param === \'object\') {\r\n			if (Array.isArray(param)) {\r\n				param.forEach(function (value, index) {\r\n					var nested = AWS.prepareRecursive(prefix + \'.member.\' + (index + 1), value);\r\n					Object.keys(nested).forEach(function (key) {\r\n						result[key] = nested[key];\r\n					});\r\n				});\r\n			}\r\n			else {\r\n				Object.keys(param).forEach(function (k) {\r\n					var nested = AWS.prepareRecursive(prefix + \'.\' + k, param[k]);\r\n					Object.keys(nested).forEach(function (key) {\r\n						result[key] = nested[key];\r\n					});\r\n				});\r\n			}\r\n		}\r\n		else {\r\n			result[prefix] = param;\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	renderPayload: function (period, volume_id) {\r\n		var metrics_list = [\r\n			\'VolumeReadBytes:Bytes\',\r\n			\'VolumeWriteBytes:Bytes\',\r\n			\'VolumeReadOps:Count\',\r\n			\'VolumeWriteOps:Count\',\r\n			\'VolumeTotalReadTime:Seconds\',\r\n			\'VolumeTotalWriteTime:Seconds\',\r\n			\'VolumeIdleTime:Seconds\',\r\n			\'VolumeQueueLength:Count\',\r\n			\'VolumeThroughputPercentage:Percent\',\r\n			\'VolumeConsumedReadWriteOps:Count\',\r\n			\'BurstBalance:Percent\'\r\n		];\r\n\r\n		var metric_payload = [];\r\n		metrics_list.forEach(function (metric) {\r\n			var parts = metric.split(\':\', 2);\r\n			var name = parts[0].replace(/[^a-zA-Z0-9]/g, \'\');\r\n			metric_payload.push({\r\n				\'Id\': name.charAt(0).toLowerCase() + name.slice(1),\r\n				\'MetricStat\': {\r\n					\'Metric\': {\r\n						\'MetricName\': parts[0],\r\n						\'Namespace\': \'AWS/EBS\',\r\n						\'Dimensions\': [\r\n							{\r\n								\'Name\': \'VolumeId\',\r\n								\'Value\': volume_id\r\n							}\r\n						]\r\n					},\r\n					\'Period\': period,\r\n					\'Stat\': \'Average\',\r\n					\'Unit\': parts[1]\r\n				}\r\n			});\r\n		});\r\n\r\n		return metric_payload;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_uri = \'/\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS EBS ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS EBS ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		if (response !== null) {\r\n			try {\r\n				response = JSON.parse(response);\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS CloudWatch API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var timestamp = new Date().getTime(),\r\n			end_time = new Date(timestamp).toISOString().replace(/\\.\\d+Z/, \'Z\'),\r\n			start_time = new Date(timestamp - AWS.request_period * 1000).toISOString().replace(/\\.\\d+Z/, \'Z\'),\r\n			payload = AWS.prepareRecursive(\'MetricDataQueries\', AWS.renderPayload(AWS.request_period, AWS.params.volume_id));\r\n\r\n		payload[\'Action\'] = \'GetMetricData\';\r\n		payload[\'Version\'] = \'2010-08-01\';\r\n		payload[\'StartTime\'] = start_time;\r\n		payload[\'EndTime\'] = end_time;\r\n		payload[\'ScanBy\'] = \'TimestampDescending\';\r\n\r\n		result = AWS.request(\'GET\', AWS.params.region, \'monitoring\', AWS.prepareParams(payload));\r\n\r\n		if (typeof result !== \'object\'\r\n			|| typeof result.GetMetricDataResponse !== \'object\'\r\n			|| typeof result.GetMetricDataResponse.GetMetricDataResult !== \'object\'\r\n			|| typeof result.GetMetricDataResponse.GetMetricDataResult.MetricDataResults !== \'object\') {\r\n			throw \'Cannot get metrics data from AWS CloudWatch API. Check debug log for more information.\';\r\n		}\r\n\r\n		return result.GetMetricDataResponse.GetMetricDataResult.MetricDataResults;\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS EBS ] ERROR: \' + error);\r\n\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','2',NULL,'Get metrics of EBS volume.\r\nFull metrics list related to EBS: https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using_cloudwatch_ebs.html','0','7d','0','',NULL,'15s','','','','200','1','0','','','0','0','0','0','0','0','0','8b3b008f7f65408fbd49e46186b01cfb','0','2','0'),
('61240','21','','10583','[{#AWS.ECS.SERVICE.NAME}]: Get metrics','aws.ecs.services.get_metrics["{#AWS.ECS.SERVICE.NAME}"]','0s;m/5','0','0','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	request_period: 600,\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload), \'\'), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'region\', \'cluster_name\', \'service_name\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareRecursive: function (prefix, param) {\r\n		var result = {};\r\n\r\n		if (typeof param === \'object\') {\r\n			if (Array.isArray(param)) {\r\n				param.forEach(function (value, index) {\r\n					var nested = AWS.prepareRecursive(prefix + \'.member.\' + (index + 1), value);\r\n					Object.keys(nested).forEach(function (key) {\r\n						result[key] = nested[key];\r\n					});\r\n				});\r\n			}\r\n			else {\r\n				Object.keys(param).forEach(function (k) {\r\n					var nested = AWS.prepareRecursive(prefix + \'.\' + k, param[k]);\r\n					Object.keys(nested).forEach(function (key) {\r\n						result[key] = nested[key];\r\n					});\r\n				});\r\n			}\r\n		}\r\n		else {\r\n			result[prefix] = param;\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	renderPayload: function (period, cluster_name, service_name) {\r\n		var metrics_list = [\r\n			\'CpuReserved:None:ECS/ContainerInsights\',\r\n			\'CpuUtilized:None:ECS/ContainerInsights\',\r\n			\'CPUUtilization:Percent:AWS/ECS\',\r\n			\'MemoryUtilization:Percent:AWS/ECS\',\r\n			\'MemoryReserved:Megabytes:ECS/ContainerInsights\',\r\n			\'MemoryUtilized:Megabytes:ECS/ContainerInsights\',\r\n			\'NetworkRxBytes:Bytes/Second:ECS/ContainerInsights\',\r\n			\'NetworkTxBytes:Bytes/Second:ECS/ContainerInsights\',\r\n			\'StorageReadBytes:Bytes:ECS/ContainerInsights\',\r\n			\'StorageWriteBytes:Bytes:ECS/ContainerInsights\',\r\n			\'DeploymentCount:Count:ECS/ContainerInsights\',\r\n			\'TaskSetCount:Count:ECS/ContainerInsights\',\r\n			\'DesiredTaskCount:Count:ECS/ContainerInsights\',\r\n			\'PendingTaskCount:Count:ECS/ContainerInsights\',\r\n			\'RunningTaskCount:Count:ECS/ContainerInsights\',\r\n			\'EphemeralStorageReserved:Gigabytes:ECS/ContainerInsights\',\r\n			\'EphemeralStorageUtilized:Gigabytes:ECS/ContainerInsights\'\r\n		];\r\n\r\n		var metric_payload = [];\r\n		metrics_list.forEach(function (metric) {\r\n			var parts = metric.split(\':\', 3);\r\n			var name = parts[0].replace(/[^a-zA-Z0-9]/g, \'\');\r\n			metric_payload.push({\r\n				\'Id\': name.charAt(0).toLowerCase() + name.slice(1),\r\n				\'MetricStat\': {\r\n					\'Metric\': {\r\n						\'MetricName\': parts[0],\r\n						\'Namespace\': parts[2],\r\n						\'Dimensions\': [\r\n							{\r\n								\'Name\': \'ClusterName\',\r\n								\'Value\': cluster_name\r\n							}\r\n							,\r\n							{\r\n								\'Name\': \'ServiceName\',\r\n								\'Value\': service_name\r\n							}\r\n						]\r\n					},\r\n					\'Period\': period,\r\n					\'Stat\': \'Average\',\r\n					\'Unit\': parts[1]\r\n				}\r\n			});\r\n		});\r\n\r\n		return metric_payload;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_uri = \'/\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS ECS  ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS ECS ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS CloudWatch API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var timestamp = new Date().getTime(),\r\n			end_time = new Date(timestamp).toISOString().replace(/\\.\\d+Z/, \'Z\'),\r\n			start_time = new Date(timestamp - AWS.request_period * 1000).toISOString().replace(/\\.\\d+Z/, \'Z\'),\r\n			payload = AWS.prepareRecursive(\'MetricDataQueries\', AWS.renderPayload(AWS.request_period, AWS.params.cluster_name, AWS.params.service_name));\r\n\r\n		payload[\'Action\'] = \'GetMetricData\';\r\n		payload[\'Version\'] = \'2010-08-01\';\r\n		payload[\'StartTime\'] = start_time;\r\n		payload[\'EndTime\'] = end_time;\r\n		payload[\'ScanBy\'] = \'TimestampDescending\';\r\n\r\n		result = AWS.request(\'GET\', AWS.params.region, \'monitoring\', AWS.prepareParams(payload));\r\n		MetricData = AWS.getField(result, \'GetMetricDataResponse.GetMetricDataResult.MetricDataResults\')\r\n\r\n		return MetricData;\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS ECS ] ERROR: \' + error);\r\n\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','2',NULL,'Get metrics of ESC services.\r\nFull metrics list related to ECS : https://docs.aws.amazon.com/ecs/index.html','0','7d','0','',NULL,'15s','','','','200','1','0','','','0','0','0','0','0','0','0','d12aae43f0f3446d96e2141a0bf303b8','0','2','0'),
('61241','21','','10584','[{#AWS.ECS.SERVICE.NAME}]: Get metrics','aws.ecs.services.get_metrics["{#AWS.ECS.SERVICE.NAME}"]','0s;m/5','0','0','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	request_period: 600,\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'GET\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload), \'\'), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'region\', \'cluster_name\', \'service_name\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareRecursive: function (prefix, param) {\r\n		var result = {};\r\n\r\n		if (typeof param === \'object\') {\r\n			if (Array.isArray(param)) {\r\n				param.forEach(function (value, index) {\r\n					var nested = AWS.prepareRecursive(prefix + \'.member.\' + (index + 1), value);\r\n					Object.keys(nested).forEach(function (key) {\r\n						result[key] = nested[key];\r\n					});\r\n				});\r\n			}\r\n			else {\r\n				Object.keys(param).forEach(function (k) {\r\n					var nested = AWS.prepareRecursive(prefix + \'.\' + k, param[k]);\r\n					Object.keys(nested).forEach(function (key) {\r\n						result[key] = nested[key];\r\n					});\r\n				});\r\n			}\r\n		}\r\n		else {\r\n			result[prefix] = param;\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	renderPayload: function (period, cluster_name, service_name) {\r\n		var metrics_list = [\r\n			\'CpuReserved:None:ECS/ContainerInsights\',\r\n			\'CpuUtilized:None:ECS/ContainerInsights\',\r\n			\'CPUUtilization:Percent:AWS/ECS\',\r\n			\'MemoryUtilization:Percent:AWS/ECS\',\r\n			\'MemoryReserved:Megabytes:ECS/ContainerInsights\',\r\n			\'MemoryUtilized:Megabytes:ECS/ContainerInsights\',\r\n			\'NetworkRxBytes:Bytes/Second:ECS/ContainerInsights\',\r\n			\'NetworkTxBytes:Bytes/Second:ECS/ContainerInsights\',\r\n			\'StorageReadBytes:Bytes:ECS/ContainerInsights\',\r\n			\'StorageWriteBytes:Bytes:ECS/ContainerInsights\',\r\n			\'DeploymentCount:Count:ECS/ContainerInsights\',\r\n			\'TaskSetCount:Count:ECS/ContainerInsights\',\r\n			\'DesiredTaskCount:Count:ECS/ContainerInsights\',\r\n			\'PendingTaskCount:Count:ECS/ContainerInsights\',\r\n			\'RunningTaskCount:Count:ECS/ContainerInsights\',\r\n			\'EphemeralStorageReserved:Gigabytes:ECS/ContainerInsights\',\r\n			\'EphemeralStorageUtilized:Gigabytes:ECS/ContainerInsights\'\r\n		];\r\n\r\n		var metric_payload = [];\r\n		metrics_list.forEach(function (metric) {\r\n			var parts = metric.split(\':\', 3);\r\n			var name = parts[0].replace(/[^a-zA-Z0-9]/g, \'\');\r\n			metric_payload.push({\r\n				\'Id\': name.charAt(0).toLowerCase() + name.slice(1),\r\n				\'MetricStat\': {\r\n					\'Metric\': {\r\n						\'MetricName\': parts[0],\r\n						\'Namespace\': parts[2],\r\n						\'Dimensions\': [\r\n							{\r\n								\'Name\': \'ClusterName\',\r\n								\'Value\': cluster_name\r\n							}\r\n							,\r\n							{\r\n								\'Name\': \'ServiceName\',\r\n								\'Value\': service_name\r\n							}\r\n						]\r\n					},\r\n					\'Period\': period,\r\n					\'Stat\': \'Average\',\r\n					\'Unit\': parts[1]\r\n				}\r\n			});\r\n		});\r\n\r\n		return metric_payload;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_uri = \'/\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS ECS  ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		Zabbix.log(4, \'[ AWS ECS ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS CloudWatch API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var timestamp = new Date().getTime(),\r\n			end_time = new Date(timestamp).toISOString().replace(/\\.\\d+Z/, \'Z\'),\r\n			start_time = new Date(timestamp - AWS.request_period * 1000).toISOString().replace(/\\.\\d+Z/, \'Z\'),\r\n			payload = AWS.prepareRecursive(\'MetricDataQueries\', AWS.renderPayload(AWS.request_period, AWS.params.cluster_name, AWS.params.service_name));\r\n\r\n		payload[\'Action\'] = \'GetMetricData\';\r\n		payload[\'Version\'] = \'2010-08-01\';\r\n		payload[\'StartTime\'] = start_time;\r\n		payload[\'EndTime\'] = end_time;\r\n		payload[\'ScanBy\'] = \'TimestampDescending\';\r\n\r\n		result = AWS.request(\'GET\', AWS.params.region, \'monitoring\', AWS.prepareParams(payload));\r\n		MetricData = AWS.getField(result, \'GetMetricDataResponse.GetMetricDataResult.MetricDataResults\')\r\n\r\n		return MetricData;\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS ECS ] ERROR: \' + error);\r\n\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','2',NULL,'Get metrics of ESC services.\r\nFull metrics list related to ECS : https://docs.aws.amazon.com/ecs/index.html','0','7d','0','',NULL,'15s','','','','200','1','0','','','0','0','0','0','0','0','0','0f80f5477ed04dbfbcb241c06854a6ff','0','2','0'),
('61242','21','','10607','[{#AWS.ELB.TARGET.GROUP.NAME}]: Get metrics','aws.elb.alb.target_groups.get_metrics["{#AWS.ELB.TARGET.GROUP.NAME}"]','0s;m/5','0','0','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n	request_period: 60,\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'POST\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload), \'\'), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'region\', \'arn\', \'target_arn\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	renderMetricQuery: function (period, arn, target_arn) {\r\n		var metrics_list = [\r\n			\'HTTPCode_Target_2XX_Count:Sum\',\r\n			\'HTTPCode_Target_3XX_Count:Sum\',\r\n			\'HTTPCode_Target_4XX_Count:Sum\',\r\n			\'HTTPCode_Target_5XX_Count:Sum\',\r\n			\'HealthyHostCount:Average\',\r\n			\'UnHealthyHostCount:Average\',\r\n			\'HealthyStateRouting:Sum\',\r\n			\'UnhealthyStateRouting:Sum\',\r\n			\'UnhealthyRoutingRequestCount:Sum\',\r\n			\'HealthyStateDNS:Sum\',\r\n			\'UnhealthyStateDNS:Sum\',\r\n			\'RequestCountPerTarget:Sum\',\r\n			\'MitigatedHostCount:Average\',\r\n			\'AnomalousHostCount:Average\',\r\n		],\r\n			regex = /loadbalancer\\/(.+)$/;\r\n\r\n		var metric_payload = [];\r\n		metrics_list.forEach(function (metric, index) {\r\n			var parts = metric.split(\':\', 2);\r\n			metric_payload.push({\r\n				\'Id\': \'m\' + index,\r\n				\'MetricStat\': {\r\n					\'Metric\': {\r\n						\'MetricName\': parts[0],\r\n						\'Namespace\': \'AWS/ApplicationELB\',\r\n						\'Dimensions\': [\r\n							{\r\n								\'Name\': \'LoadBalancer\',\r\n								\'Value\': arn.match(regex)[1],\r\n							},\r\n							{\r\n								\'Name\': \'TargetGroup\',\r\n								\'Value\': target_arn\r\n							}\r\n						]\r\n					},\r\n					\'Period\': period,\r\n					\'Stat\': parts[1],\r\n				}\r\n			});\r\n		});\r\n\r\n		return metric_payload;\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = JSON.stringify([]);\r\n		}\r\n		else {\r\n			data = JSON.stringify(data)\r\n		}\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			canonical_uri = \'/\',\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'x-amz-content-sha256:\' + sha256(data));\r\n		request.addHeader(\'X-Amz-Target: GraniteServiceVersion20100801.GetMetricData\')\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS ELB ] Sending request: \' + url);\r\n		response = request.post(url, data);\r\n		Zabbix.log(4, \'[ AWS ELB ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		return JSON.parse(response);\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var end_time = Math.floor((new Date().getTime()) / 1000),\r\n			start_time = end_time - AWS.request_period * 60;\r\n		payload = {\r\n			\'StartTime\': start_time,\r\n			\'EndTime\': end_time,\r\n			\'ScanBy\': \'TimestampDescending\',\r\n			\'MetricDataQueries\': AWS.renderMetricQuery(AWS.request_period, AWS.params.arn, AWS.params.target_arn)\r\n		};\r\n\r\n		return AWS.getField(AWS.request(\'POST\', AWS.params.region, \'monitoring\', \'\', payload), \'MetricDataResults\');\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n	return JSON.stringify(AWS.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS ELB Get targets group metrics] ERROR: \' + error);\r\n\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','2',NULL,'Get the metrics of the ELB target group `{#AWS.ELB.TARGET.GROUP.NAME}`.\r\nFull list of metrics related to AWS ELB here: https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-cloudwatch-metrics.html#user-authentication-metric-table','0','7d','0','',NULL,'{$AWS.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','306971d2e8fb441d8ae4a658b26304c3','0','2','0'),
('61243','21','','10627','[{#AWS.ELB.TARGET.GROUP.NAME}]: Get metrics','aws.elb.nlb.target_groups.get_metrics["{#AWS.ELB.TARGET.GROUP.NAME}"]','0s;m/5','0','0','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n	request_period: 60,\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'POST\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload), \'\'), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'region\', \'arn\', \'target_arn\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	renderMetricQuery: function (period, arn, target_arn) {\r\n		var metrics_list = [\r\n			\'HealthyHostCount:Minimum\',\r\n			\'UnHealthyHostCount:Maximum\'\r\n		],\r\n			regex = /loadbalancer\\/(.+)$/;\r\n\r\n		var metric_payload = [];\r\n		metrics_list.forEach(function (metric, index) {\r\n			var parts = metric.split(\':\', 2);\r\n			metric_payload.push({\r\n				\'Id\': \'m\' + index,\r\n				\'MetricStat\': {\r\n					\'Metric\': {\r\n						\'MetricName\': parts[0],\r\n						\'Namespace\': \'AWS/NetworkELB\',\r\n						\'Dimensions\': [\r\n							{\r\n								\'Name\': \'LoadBalancer\',\r\n								\'Value\': arn.match(regex)[1],\r\n							},\r\n							{\r\n								\'Name\': \'TargetGroup\',\r\n								\'Value\': target_arn\r\n							}\r\n						]\r\n					},\r\n					\'Period\': period,\r\n					\'Stat\': parts[1],\r\n				}\r\n			});\r\n		});\r\n\r\n		return metric_payload;\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = JSON.stringify([]);\r\n		}\r\n		else {\r\n			data = JSON.stringify(data)\r\n		}\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			canonical_uri = \'/\',\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n			signed_headers = \'content-encoding;host;x-amz-date\',\r\n			canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'x-amz-content-sha256:\' + sha256(data));\r\n		request.addHeader(\'X-Amz-Target: GraniteServiceVersion20100801.GetMetricData\')\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + (AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken));\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS ELB ] Sending request: \' + url);\r\n		response = request.post(url, data);\r\n		Zabbix.log(4, \'[ AWS ELB ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		return JSON.parse(response);\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var end_time = Math.floor((new Date().getTime()) / 1000),\r\n			start_time = end_time - AWS.request_period * 60;\r\n		payload = {\r\n			\'StartTime\': start_time,\r\n			\'EndTime\': end_time,\r\n			\'ScanBy\': \'TimestampDescending\',\r\n			\'MetricDataQueries\': AWS.renderMetricQuery(AWS.request_period, AWS.params.arn, AWS.params.target_arn)\r\n		};\r\n\r\n		return AWS.getField(AWS.request(\'POST\', AWS.params.region, \'monitoring\', \'\', payload), \'MetricDataResults\');\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n	return JSON.stringify(AWS.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS ELB Get targets group metrics] ERROR: \' + error);\r\n\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','2',NULL,'Get the metrics of the ELB target group `{#AWS.ELB.TARGET.GROUP.NAME}`.\r\nFull list of metrics related to AWS ELB here: https://docs.aws.amazon.com/elasticloadbalancing/latest/network/load-balancer-cloudwatch-metrics.html#user-authentication-metric-table','0','7d','0','',NULL,'{$AWS.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','9438a03b48bd4617a2363f83f758f107','0','2','0'),
('61244','21','','10530','Filter [{#AWS.S3.FILTER.ID.NAME}]: Get request metrics','aws.s3.get_metrics["{#AWS.S3.FILTER.ID.NAME}"]','{$AWS.S3.UPDATE.INTERVAL}','0','0','0','4','','','','',NULL,NULL,'var AWS = {\r\n	params: {},\r\n	metadata: \'http://169.254.169.254/latest/\',\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path;\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	isFloat: function (n) {\r\n		n = parseFloat(n);\r\n		return Number(n) === n && n % 1 !== 0;\r\n	},\r\n\r\n	checkNumber: function checkNumber(string) {\r\n		if (typeof string !== "string" || isNaN(string) || AWS.isFloat(string)) {\r\n			throw \'Incorrect "timespan" parameter given: \' + string + \' Must be an unsigned number\';\r\n		}\r\n		return string;\r\n	},\r\n\r\n	getRoleBaseCredentials: function () {\r\n		AWS.params[\'auth_type\'] = \'role_base\';\r\n		var request = new HttpRequest();\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token-ttl-seconds: 21600\');\r\n		var token = request.put(AWS.metadata + \'api/token\');\r\n\r\n		if (request.getStatus() !== 200 || token === null || token === \'\') {\r\n			throw \'Error getting IMDSv2 session token.\';\r\n		}\r\n		request.addHeader(\'X-aws-ec2-metadata-token: \' + token);\r\n		var IamRoleName = request.get(AWS.metadata + \'meta-data/iam/security-credentials\');\r\n\r\n		if (request.getStatus() !== 200 || IamRoleName === null || IamRoleName === \'\') {\r\n			throw \'Error getting security credentials from instance metadata. Role not found.\';\r\n		}\r\n\r\n		credentials = request.get(AWS.metadata + \'meta-data/iam/security-credentials/\' + encodeURI(IamRoleName));\r\n\r\n		if (request.getStatus() !== 200 || credentials === null || credentials === \'\') {\r\n			throw \'Error getting security credentials from instance metadata.\';\r\n		}\r\n\r\n		try {\r\n			credentials = JSON.parse(credentials);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from instance metadata. Check debug log for more information.\';\r\n		}\r\n\r\n		[\'AccessKeyId\', \'SecretAccessKey\', \'Token\'].forEach(function (field) {\r\n			if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n				throw \'Required credentials are not set: "\' + field + \'".\';\r\n			};\r\n			AWS.params[field] = credentials[field];\r\n		});\r\n	},\r\n\r\n	setParams: function (params) {\r\n		AWS.params[\'proxy\'] = params.proxy;\r\n		switch (AWS.getField(params, \'auth_type\')) {\r\n			case \'role_base\':\r\n				AWS.getRoleBaseCredentials();\r\n				break;\r\n			case \'assume_role\':\r\n				if (typeof params.metadata_auth === \'undefined\' || params.metadata_auth === \'\' || (params.metadata_auth !== \'true\' && params.metadata_auth !== \'false\')) {\r\n					throw \'Required param metadata_auth for assume_role is not set or has invalid value: "\' + params.metadata_auth + \'". Expected "true" or "false".\';\r\n				}\r\n				if (params.metadata_auth === \'true\') {\r\n					AWS.getRoleBaseCredentials();\r\n					AWS.params[\'SessionToken\'] = AWS.params[\'Token\'];\r\n					AWS.params[\'auth_type\'] = \'assume_role_metadata\';\r\n\r\n					[\'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				if (params.metadata_auth === \'false\') {\r\n					AWS.params[\'auth_type\'] = \'assume_role\';\r\n\r\n					[\'AccessKeyId\', \'SecretAccessKey\', \'sts_region\', \'role_arn\'].forEach(function (field) {\r\n						if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n							throw \'Required param is not set: "\' + field + \'".\';\r\n						}\r\n						AWS.params[field] = params[field];\r\n					});\r\n				}\r\n\r\n				const role_arn_regex = /role\\/(.+)$/;\r\n				const match = AWS.params.role_arn.match(role_arn_regex);\r\n				if (!match) {\r\n					throw \'Invalid role ARN format.\';\r\n				}\r\n\r\n				const payload = {\r\n					\'Action\': \'AssumeRole\',\r\n					\'Version\': \'2011-06-15\',\r\n					\'RoleArn\': AWS.params.role_arn,\r\n					\'RoleSessionName\': match[1] + \'Session\',\r\n				};\r\n\r\n				credentials = AWS.getField(AWS.request(\'POST\', AWS.params.sts_region, \'sts\', AWS.prepareParams(payload), \'\'), \'AssumeRoleResponse.AssumeRoleResult.Credentials\');\r\n\r\n				[\'AccessKeyId\', \'SecretAccessKey\', \'SessionToken\'].forEach(function (field) {\r\n					if (typeof credentials !== \'object\' || typeof credentials[field] === \'undefined\' || credentials[field] === \'\') {\r\n						throw \'Required credentials are not set: "\' + field + \'".\';\r\n					};\r\n					AWS.params[field] = credentials[field];\r\n				});\r\n				break;\r\n			default:\r\n				AWS.params[\'auth_type\'] = \'access_key\';\r\n				[\'AccessKeyId\', \'SecretAccessKey\'].forEach(function (field) {\r\n					if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n						throw \'Required param is not set: "\' + field + \'".\';\r\n					}\r\n					AWS.params[field] = params[field];\r\n				});\r\n		}\r\n		[\'region\', \'bucket_name\', \'filter_id\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: "\' + field + \'".\';\r\n			}\r\n			AWS.params[field] = params[field];\r\n		});\r\n\r\n		updateInterval = AWS.checkNumber(\'{$AWS.S3.UPDATE.INTERVAL}\');\r\n\r\n		if (updateInterval > 86400 || updateInterval < 1) {\r\n			throw \'Incorrect "update interval" parameter given: \' + updateInterval + \' Must be between 1 and 86400 seconds.\';\r\n		}\r\n	},\r\n\r\n	sign: function (key, message) {\r\n		var hex = hmac(\'sha256\', key, message);\r\n\r\n		if ((hex.length % 2) === 1) {\r\n			throw \'Invalid length of a hex string!\';\r\n		}\r\n\r\n		var result = new Int8Array(hex.length / 2);\r\n		for (var i = 0, b = 0; i < hex.length; i += 2, b++) {\r\n			result[b] = parseInt(hex.substring(i, i + 2), 16);\r\n		}\r\n\r\n		return result;\r\n	},\r\n\r\n	renderMetricQuery: function (period, bucket_name, filter_id) {\r\n		var metrics_list = [\r\n			\'AllRequests:Count:Sum\',\r\n			\'GetRequests:Count:Sum\',\r\n			\'PutRequests:Count:Sum\',\r\n			\'DeleteRequests:Count:Sum\',\r\n			\'HeadRequests:Count:Sum\',\r\n			\'PostRequests:Count:Sum\',\r\n			\'SelectRequests:Count:Sum\',\r\n			\'SelectBytesScanned:Bytes:Average\',\r\n			\'SelectBytesReturned:Bytes:Average\',\r\n			\'ListRequests:Count:Sum\',\r\n			\'BytesDownloaded:Bytes:Average\',\r\n			\'BytesUploaded:Bytes:Average\',\r\n			\'4xxErrors:Count:Average\',\r\n			\'5xxErrors:Count:Average\',\r\n			\'TotalRequestLatency:Milliseconds:p90\',\r\n			\'FirstByteLatency:Milliseconds:p90\',\r\n			\'ReplicationLatency:Seconds:Average\',\r\n			\'BytesPendingReplication:Bytes:Average\',\r\n			\'OperationsPendingReplication:Count:Average\',\r\n\r\n		];\r\n\r\n		var metric_payload = [];\r\n		metrics_list.forEach(function (metric, index) {\r\n			var parts = metric.split(\':\', 3);\r\n			metric_payload.push({\r\n				\'Id\': \'m\' + index,\r\n				\'MetricStat\': {\r\n					\'Metric\': {\r\n						\'MetricName\': parts[0],\r\n						\'Namespace\': \'AWS/S3\',\r\n						\'Dimensions\': [\r\n							{\r\n								\'Name\': \'BucketName\',\r\n								\'Value\': bucket_name\r\n							},\r\n							{\r\n								\'Name\': \'FilterId\',\r\n								\'Value\': filter_id\r\n							}\r\n						]\r\n					},\r\n					\'Period\': period,\r\n					\'Stat\': parts[2],\r\n					\'Unit\': parts[1]\r\n				}\r\n			});\r\n		});\r\n\r\n		return metric_payload;\r\n\r\n	},\r\n	prepareParams: function (params) {\r\n		var result = [];\r\n\r\n		Object.keys(params).sort().forEach(function (key) {\r\n			if (typeof params[key] !== \'object\') {\r\n				result.push(key + \'=\' + encodeURIComponent(params[key]));\r\n			}\r\n			else {\r\n				result.push(prepareObject(key, params[key]));\r\n			}\r\n		});\r\n\r\n		return result.join(\'&\');\r\n	},\r\n\r\n	request: function (method, region, service, params, data) {\r\n		if (typeof data === \'undefined\' || data === null) {\r\n			data = \'\';\r\n		}\r\n		else {\r\n			data = JSON.stringify(data)\r\n		}\r\n\r\n		var amzdate = (new Date()).toISOString().replace(/\\.\\d+Z/, \'Z\').replace(/[-:]/g, \'\'),\r\n			date = amzdate.replace(/T\\d+Z/, \'\'),\r\n			host = service + \'.\' + region + \'.amazonaws.com\',\r\n			canonical_uri = \'/\';\r\n\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			token = AWS.params.auth_type === \'role_base\' ? AWS.params.Token : AWS.params.SessionToken;\r\n			var canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\' + \'x-amz-security-token:\' + token + \'\\n\',\r\n				signed_headers = \'content-encoding;host;x-amz-date;x-amz-security-token\';\r\n		}\r\n		else {\r\n			var canonical_headers = \'content-encoding:amz-1.0\\n\' + \'host:\' + host + \'\\n\' + \'x-amz-date:\' + amzdate + \'\\n\',\r\n				signed_headers = \'content-encoding;host;x-amz-date\';\r\n		}\r\n\r\n		var canonical_request = method + \'\\n\' + canonical_uri + \'\\n\' + params + \'\\n\' + canonical_headers + \'\\n\' + signed_headers + \'\\n\' + sha256(data),\r\n			credential_scope = date + \'/\' + region + \'/\' + service + \'/\' + \'aws4_request\',\r\n			request_string = \'AWS4-HMAC-SHA256\' + \'\\n\' + amzdate + \'\\n\' + credential_scope + \'\\n\' + sha256(canonical_request),\r\n			key = AWS.sign(\'AWS4\' + AWS.params.SecretAccessKey, date),\r\n			key = AWS.sign(key, region),\r\n			key = AWS.sign(key, service),\r\n			key = AWS.sign(key, \'aws4_request\'),\r\n			request = new HttpRequest(),\r\n			url = \'https://\' + host + canonical_uri + \'?\' + params;\r\n\r\n		if (typeof AWS.params.proxy !== \'undefined\' && AWS.params.proxy !== \'\') {\r\n			request.setProxy(AWS.params.proxy);\r\n		}\r\n		request.addHeader(\'x-amz-date: \' + amzdate);\r\n		request.addHeader(\'X-Amz-Target: GraniteServiceVersion20100801.GetMetricData\')\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Content-Type: application/json\');\r\n		request.addHeader(\'Content-Encoding: amz-1.0\');\r\n		request.addHeader(\'Authorization: \' + \'AWS4-HMAC-SHA256 Credential=\' + AWS.params.AccessKeyId + \'/\' + credential_scope + \', \' + \'SignedHeaders=\' + signed_headers + \', \' + \'Signature=\' + hmac(\'sha256\', key, request_string));\r\n		if (AWS.params.auth_type === \'role_base\' || AWS.params.auth_type === \'assume_role_metadata\' || (AWS.params.auth_type === \'assume_role\' & !params.includes(\'AssumeRole\'))) {\r\n			request.addHeader(\'X-Amz-Security-Token: \' + token);\r\n		}\r\n\r\n		Zabbix.log(4, \'[ AWS S3 ] Sending request: \' + url);\r\n		response = request.post(url, data);\r\n		Zabbix.log(4, \'[ AWS S3 ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			try {\r\n				response = JSON.parse(XML.toJson(response));\r\n			}\r\n			catch (error) {\r\n				throw \'Failed to parse response received from AWS CloudWatch API. Check debug log for more information.\';\r\n			}\r\n		}\r\n\r\n		return response;\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var payload = {},\r\n			end_time = Math.floor((new Date().getTime()) / 1000),\r\n			start_time = end_time - updateInterval;\r\n\r\n		payload[\'StartTime\'] = start_time;\r\n		payload[\'EndTime\'] = end_time;\r\n		payload[\'ScanBy\'] = \'TimestampDescending\';\r\n		payload[\'MetricDataQueries\'] = AWS.renderMetricQuery(60, AWS.params.bucket_name, AWS.params.filter_id);\r\n		result = AWS.request(\'POST\', AWS.params.region, \'monitoring\', \'\', payload);\r\n		if (typeof result !== \'object\' || typeof result.MetricDataResults !== \'object\') {\r\n			throw \'Cannot get metrics data from AWS CloudWatch API. Check debug log for more information.\';\r\n		}\r\n\r\n		return result.MetricDataResults;\r\n	}\r\n};\r\n\r\ntry {\r\n	AWS.setParams(JSON.parse(value));\r\n\r\n	return JSON.stringify(AWS.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ AWS S3 ] ERROR: \' + error);\r\n\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','2',NULL,'Get bucket request metrics filter: \'{#AWS.S3.FILTER.ID.NAME}\'.\r\nFull metrics list related to S3: https://docs.aws.amazon.com/AmazonS3/latest/userguide/metrics-dimensions.html','0','7d','0','',NULL,'15s','','','','200','1','0','','','0','0','0','0','0','0','0','eabbd51547cb4a0484182d42601728c3','0','2','0'),
('61401','21','','10531','Storage account [{#NAME}]: Get data','azure.get.storage.acc[{#NAME}]','1m','0','0','0','4','','','','',NULL,NULL,'var AzureStorage = {\r\n	params: {},\r\n\r\n	setParams: function (params) {\r\n		[\'token\', \'id\'].forEach(function (field) {\r\n			if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n				throw \'Required param is not set: \' + field + \'.\';\r\n			}\r\n		});\r\n\r\n		AzureStorage.params = params;\r\n	},\r\n\r\n	request: function (url) {\r\n		var response, request = new HttpRequest();\r\n		if (typeof AzureStorage.params.proxy !== \'undefined\' && AzureStorage.params.proxy !== \'\') {\r\n			request.setProxy(AzureStorage.params.proxy);\r\n		}\r\n		request.addHeader(\'Accept: application/json\');\r\n		request.addHeader(\'Authorization: Bearer \' + AzureStorage.params.token);\r\n		Zabbix.log(4, \'[ Azure ] Sending request: \' + url);\r\n		response = request.get(url);\r\n		if (request.getStatus() !== 200) {\r\n			throw \'Request failed with status code \' + request.getStatus() + \': \' + response;\r\n		}\r\n		try {\r\n			return JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from API.\';\r\n		}\r\n	},\r\n\r\n	getField: function (data, path) {\r\n		var steps = path.split(\'.\');\r\n		for (var i = 0; i < steps.length; i++) {\r\n			var step = steps[i];\r\n			if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n				throw \'Required field was not found: \' + path + \' input data: \' + JSON.stringify(data);\r\n			}\r\n\r\n			data = data[step];\r\n		}\r\n\r\n		return data;\r\n	},\r\n\r\n	getMetricsData: function () {\r\n		var data = {};\r\n		start_date = new Date((new Date().getTime()) - 4200000).toISOString().replace(/\\.\\d+/, \'\');\r\n		end_date = new Date((new Date().getTime()) - 600000).toISOString().replace(/\\.\\d+/, \'\');\r\n		endpoints = {\r\n			\'tableServices\': \'/tableServices/default/providers/Microsoft.Insights/metrics?metricnames=TableCapacity,TableCount,TableEntityCount,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H&timespan=\' + encodeURIComponent(start_date) + \'/\' + encodeURIComponent(end_date),\r\n			\'blobServices\': \'/blobServices/default/providers/Microsoft.Insights/metrics?metricnames=BlobCapacity,BlobCount,ContainerCount,IndexCapacity,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H&timespan=\' + encodeURIComponent(start_date) + \'/\' + encodeURIComponent(end_date),\r\n			\'fileServices\': \'/fileServices/default/providers/Microsoft.Insights/metrics?metricnames=FileCapacity,FileCount,FileShareCount,FileShareSnapshotCount,FileShareSnapshotSize,FileShareCapacityQuota,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H&timespan=\' + encodeURIComponent(start_date) + \'/\' + encodeURIComponent(end_date),\r\n			\'storageAccount\': \'/providers/Microsoft.Insights/metrics?metricnames=UsedCapacity,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H&timespan=\' + encodeURIComponent(start_date) + \'/\' + encodeURIComponent(end_date),\r\n			\'queueServices\': \'/queueServices/default/providers/Microsoft.Insights/metrics?metricnames=QueueCapacity,QueueCount,QueueMessageCount,Transactions,Ingress,Egress,SuccessServerLatency,SuccessE2ELatency,Availability&api-version=2021-05-01&interval=PT1H&timespan=\' + encodeURIComponent(start_date) + \'/\' + encodeURIComponent(end_date)\r\n		};\r\n\r\n		Object.keys(endpoints).forEach(function (field) {\r\n			data[field] = {};\r\n			metrics = AzureStorage.request(\'https://management.azure.com\' + AzureStorage.params.id + endpoints[field]);\r\n\r\n			if (!metrics.hasOwnProperty(\'value\')) {\r\n				throw \'Failed getting required field. Check debug log for more information.\';\r\n			}\r\n\r\n			for (k in metrics.value) {\r\n				key = AzureStorage.getField(metrics.value[k], \'name.value\')\r\n				if (metrics.value[k].timeseries.length === 0) {\r\n					metrics.value[k].timeseries.push({ \'data\': [\'nodata\'] })\r\n				}\r\n				data[field][key] = AzureStorage.getField(metrics.value[k], \'timeseries.0.data.0\');\r\n			}\r\n		});\r\n		return data\r\n	}\r\n\r\n};\r\n\r\ntry {\r\n	AzureStorage.setParams(JSON.parse(value));\r\n	return JSON.stringify(AzureStorage.getMetricsData());\r\n}\r\ncatch (error) {\r\n	error += (String(error).endsWith(\'.\')) ? \'\' : \'.\';\r\n	Zabbix.log(3, \'[ Azure ] ERROR: \' + error);\r\n	return JSON.stringify({ \'error\': error });\r\n}','','0','','','','','2',NULL,'The HTTP API endpoint that returns storage metrics with the name `[{#NAME}]`.','0','7d','0','',NULL,'{$AZURE.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','3361508a601748f5aca339f952430889','0','2','0'),
('61461','19','','10575','GCP Cloud SQL PostgreSQL: Databases discovery','gcp.cloudsql.pgsql.db.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','','','','','1',NULL,'Databases discovery for the particular PostgreSQL instance.','0','7d','1','',NULL,'{$GCP.DATA.TIMEOUT}','https://sqladmin.googleapis.com/sql/v1beta4/projects/{$GCP.PROJECT.ID}/instances/{HOST.NAME}/databases','','','200','1','0','','Content-Type: application/json\r\nAuthorization: Bearer {$GCP.AUTH.TOKEN}','0','0','0','0','0','0','0','090d05a647384858a8b9efe5502c0a76','0','2','0'),
('61463','21','','10575','Database [{#PGSQL.DB.NAME}]: Metrics raw','gcp.cloudsql.pgsql.db.metrics.get[{#PGSQL.DB.NAME}]','{$GCP.TIME.WINDOW}','0','0','0','4','','','','',NULL,NULL,'var base_path = \'cloudsql.googleapis.com/database/postgresql/\',\r\n	obj = {};\r\n\r\nfunction checkParams(params) {\r\n	[\'project_id\', \'time_window\', \'database_id\', \'token\'].forEach(function (field) {\r\n		if (typeof params !== \'object\' || typeof params[field] === \'undefined\' || params[field] === \'\') {\r\n			throw \'Required param is not set: \' + field + \'.\';\r\n		}\r\n	});\r\n	if (!params.time_window.match(/^[0-9]+(m|h)$/)) {\r\n		throw \'Incorrect update interval for parameter  time_window. Valid ranges 1m-23h.\';\r\n	}\r\n	return params;\r\n}\r\n\r\nfunction getField(data, path) {\r\n	var steps = path.split(\'.\');\r\n\r\n	for (var i = 0; i < steps.length; i++) {\r\n		var step = steps[i];\r\n\r\n		if (typeof data !== \'object\' || typeof data[step] === \'undefined\') {\r\n			throw \'Required field "\' + path + \'" is not present in data received.\';\r\n		}\r\n		data = data[step];\r\n	}\r\n	return data;\r\n}\r\n\r\nfunction getHttpData(url, token, body) {\r\n	var request = new HttpRequest();\r\n	if (typeof params.proxy !== \'undefined\' && params.proxy !== \'\') {\r\n		request.setProxy(params.proxy);\r\n	};\r\n	request.addHeader(\'Authorization: Bearer \' + token);\r\n	request.addHeader(\'Content-Type: application/json\');\r\n\r\n	var response = request.post(url, JSON.stringify(body));\r\n\r\n	Zabbix.log(4, \'[ GCP API ] [ \' + url + \' ] Received response with status code \' + request.getStatus() + \': \' + response);\r\n\r\n	if (response !== null) {\r\n		try {\r\n			response = JSON.parse(response);\r\n		}\r\n		catch (error) {\r\n			throw \'Failed to parse response received from GCP API. Check debug log for more information.\';\r\n		}\r\n	}\r\n\r\n	if (typeof response !== \'object\' || response === null) {\r\n		throw \'Cannot process response data: received data is not an object. Check debug log for more information.\';\r\n	}\r\n\r\n	if (request.getStatus() !== 200) {\r\n		if (typeof (response.error && response.error.message) !== \'undefined\') {\r\n			throw response.error.message;\r\n		}\r\n		else {\r\n			throw \'Failed to receive data: invalid response status code. Check debug log for more information.\';\r\n		}\r\n	}\r\n	return response;\r\n};\r\n\r\nfunction singleMetrics(tsd) {\r\n	var result = {};\r\n\r\n	for (i in tsd) {\r\n		result[getField(tsd[i], \'labelValues.4.stringValue\')] = getField(tsd[i], \'pointData.0.values.0.int64Value\');\r\n	}\r\n	return result;\r\n}\r\n\r\nvar params = checkParams(JSON.parse(value)),\r\n	filter = \' | within \' + params.time_window + " | filter database_id =\'" + params.database_id + "\'" + " | filter database =\'" + params.database_name + "\'",\r\n	j_filter = filter + \' | join\',\r\n	url = \'https://monitoring.googleapis.com/v3/projects/\' + params.project_id + \'/timeSeries:query\',\r\n	common_paths = [\'deadlock_count\', \'tuples_returned_count\', \'tuples_fetched_count\'],\r\n	common_raw = getHttpData(url, params.token, { query: \'{\' + common_paths.map(function (path) { return base_path + path; }).join(\';\') + \'}\' + j_filter }),\r\n	keys = getField(common_raw, \'timeSeriesDescriptor.pointDescriptors\'),\r\n	values = getField(common_raw, \'timeSeriesData.0.pointData.0.values\'),\r\n	re = /(^t_\\d+\\.value\\.)/g;\r\n\r\nfor (i in keys) {\r\n	var value_types = [\'int64Value\', \'doubleValue\', \'stringValue\', \'boolValue\'];\r\n\r\n	for (v in value_types) {\r\n		if (typeof values[i][value_types[v]] !== \'undefined\') {\r\n			obj[getField(keys[i], \'key\').replace(re, \'\')] = values[i][value_types[v]];\r\n		}\r\n	}\r\n}\r\n\r\nvar single_paths = [\'transaction_count\', \'blocks_read_count\', \'tuples_processed_count\', \'tuple_size\'],\r\n	single_queries = single_paths.map(function (path) { return { query: base_path + path + filter }; });\r\n\r\nfor (q in single_queries) {\r\n	raw = getHttpData(url, params.token, single_queries[q]);\r\n	obj = Object.assign(obj, singleMetrics(getField(raw, \'timeSeriesData\')));\r\n}\r\n\r\nreturn JSON.stringify(obj);','','0','','','','','2',NULL,'PostgreSQL metrics in raw format.','0','7d','0','',NULL,'{$GCP.DATA.TIMEOUT}','','','','200','1','0','','','0','0','0','0','0','0','0','7a1df30ae0c443839fe625142aea61b2','0','2','0'),
('61505','19','','10587','Server [{#SERVER_ID}]:[{#SERVER_NAME}]: Status','openstack.nova.server.status.get[{#SERVER_ID}]','{$OPENSTACK.NOVA.INTERVAL.SERVERS}','31d','365d','0','3','','','','',NULL,'1106','','','0','','','','','2',NULL,'Server status.','0','7d','0','',NULL,'10s','{$OPENSTACK.NOVA.SERVICE.URL}/servers/{#SERVER_ID}','','','200','1','0','{$OPENSTACK.HTTP.PROXY}','X-Auth-Token: {$OPENSTACK.TOKEN}','0','0','0','0','0','0','0','84fd4be0c5f84744ac6bd93d4d4e8f0e','0','2','0'),
('61522','21','','10617','Block volumes discovery','oci.block.volumes.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'function validateZabbixParams(requiredParams, allParams) {\r\n	requiredParams.forEach(function (field) {\r\n		if (typeof allParams !== \'object\' || typeof allParams[field] === \'undefined\' || allParams[field] === \'\') {\r\n			throw \'Required param is not set: \' + field + \'.\';\r\n		}\r\n	});\r\n}\r\n\r\nfunction prepareCompartments(compartments, tenancy) {\r\n	if (typeof compartments === \'undefined\' || compartments === \'\') {\r\n		return [tenancy];\r\n	} else {\r\n		return compartments.split(\',\')\r\n	}\r\n}\r\n\r\nfunction OCI(service, action, params) {\r\n	this.zabbixLogPrefix = \'[ OCI ] [ \' + service + \' ] [ \' + action + \' ]\';\r\n	this.request = new HttpRequest();\r\n\r\n	this.hash = function (string) {\r\n		return sha256(string);\r\n	};\r\n\r\n	this.sign = function (string) {\r\n		return sign(\'sha256\', params[\'private_key\'], string);\r\n	};\r\n\r\n	this.encode = function (hash) {\r\n		const hexArr = hash.match(/.{1,2}/g);\r\n		var uInt8Array = new Uint8Array(hexArr.length);\r\n		hexArr.forEach(function (hex, idx) {\r\n			uInt8Array[idx] = parseInt(hex, 16);\r\n		});\r\n		return btoa(uInt8Array);\r\n	};\r\n\r\n	this.getDate = function () {\r\n		const weekdayShortList = [\'Sun\', \'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', \'Sat\'];\r\n		const monthShortList = [\'jan\', \'feb\', \'mar\', \'apr\', \'may\', \'jun\', \'jul\', \'aug\', \'sep\', \'oct\', \'nov\', \'dec\'];\r\n		const today = new Date();\r\n		return weekdayShortList[today.getUTCDay()] + \', \' + today.getUTCDate() + \' \' + monthShortList[today.getUTCMonth()] + \' \' + today.getUTCFullYear() + \' \' + today.getUTCHours() + \':\' + today.getUTCMinutes() + \':\' + today.getUTCSeconds() + \' GMT\';\r\n	};\r\n\r\n	this.executeRequest = function (httpMethod, apiPath, apiParams, mql, namespace) {\r\n		var headers = \'(request-target) date host\';\r\n		const contentTypeHeader = \'content-type: application/json\';\r\n		const dateHeader = \'date: \' + this.getDate();\r\n		const hostHeader = \'host: \' + params[\'api_host\'];\r\n		const requestTarget = \'(request-target): \' + httpMethod + \' \' + apiPath + apiParams;\r\n		var signingString = requestTarget + \'\\n\' + dateHeader + \'\\n\' + hostHeader;\r\n		var reqHeaders = [contentTypeHeader, dateHeader];\r\n\r\n		if (httpMethod === \'post\') {\r\n			var body = JSON.stringify({\r\n				\'namespace\': namespace,\r\n				\'query\': mql\r\n			});\r\n			headers = headers + \' x-content-sha256 content-type content-length\';\r\n			const bodyHeader = \'x-content-sha256: \' + this.encode(this.hash(body));\r\n			const bodyLengthHeader = \'content-length: \' + body.length;\r\n			signingString = signingString + \'\\n\' + bodyHeader + \'\\n\' + contentTypeHeader + \'\\n\' + bodyLengthHeader;\r\n			reqHeaders.push(bodyHeader, bodyLengthHeader);\r\n		}\r\n\r\n		const signature = this.encode(this.sign(signingString));\r\n\r\n		reqHeaders.push(\'Authorization: Signature version="1",keyId="\' + params[\'tenancy_ocid\'] + \'/\' + params[\'user_ocid\'] + \'/\' + params[\'fingerprint\'] + \'",algorithm="rsa-sha256",headers="\' + headers + \'",signature="\' + signature + \'"\');\r\n		for (var header = 0, headerLength = reqHeaders.length; header < headerLength; header++) {\r\n			this.request.addHeader(reqHeaders[header]);\r\n		}\r\n\r\n		if (params[\'http_proxy\']) {\r\n			this.request.setProxy(params[\'http_proxy\']);\r\n			Zabbix.log(4, this.zabbixLogPrefix + \' Using http proxy: \' + params[\'http_proxy\']);\r\n		}\r\n\r\n		if (httpMethod === \'post\') {\r\n			var apiRateLimitExceeded = false;\r\n			do {\r\n				const response = this.request.post(\'https://\' + params[\'api_host\'] + apiPath + apiParams, body);\r\n\r\n				try {\r\n					if (JSON.parse(response)[\'code\'] === \'TooManyRequests\') {\r\n\r\n						apiRateLimitExceeded = true;\r\n						Zabbix.sleep(1000);\r\n					} else {\r\n						apiRateLimitExceeded = false;\r\n					}\r\n				} catch (error) {\r\n					Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the response: \' + JSON.stringify(response));\r\n					throw \'Could not parse the response. See logs for more information.\';\r\n				}\r\n			} while (apiRateLimitExceeded);\r\n		} else {\r\n			const response = this.request.get(\'https://\' + params[\'api_host\'] + apiPath + apiParams);\r\n		}\r\n\r\n		this.request.clearHeader();\r\n\r\n		if (this.request.getStatus() === parseInt(params[\'http_status_code\'])) {\r\n			return response;\r\n		} else {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Unexpected HTTP response code: \' + this.request.getStatus());\r\n			throw \'Unexpected HTTP response code: \' + this.request.getStatus();\r\n		}\r\n	};\r\n\r\n	this.extractData = function (httpMethod, data, keys, compartment) {\r\n		try {\r\n			data = JSON.parse(data);\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the received JSON object: \' + data);\r\n			throw \'Could not parse received JSON object. See logs for more information.\';\r\n		}\r\n\r\n		if (typeof keys == \'object\') {\r\n			var returnBuffer = [];\r\n			for (var dataObj = 0, dataLength = data.length; dataObj < dataLength; dataObj++) {\r\n\r\n				var objectBuffer = {};\r\n				for (var key = 0, keysLength = keys.length; key < keysLength; key++) {\r\n					if (data[dataObj][keys[key]] || data[dataObj][keys[key]] == null) {\r\n						objectBuffer[keys[key].match(/^[a-z]+$|[A-Z][a-z]+$/)[0].toLowerCase()] = data[dataObj][keys[key]];\r\n					} else {\r\n						Zabbix.log(3, this.zabbixLogPrefix + \' Received an unexpected JSON object. Could not get value for key "\' + keys[key] + \'" in JSON: \' + JSON.stringify(data[dataObj]));\r\n						throw \'Received an unexpected JSON object. See logs for more information.\';\r\n					}\r\n				}\r\n				if (typeof compartment != \'undefined\' && compartment != \'\') objectBuffer[\'compartment\'] = compartment;\r\n				returnBuffer.push(objectBuffer);\r\n			}\r\n			return returnBuffer;\r\n		}\r\n\r\n		try {\r\n			if (httpMethod === \'get\') {\r\n				return data[keys];\r\n			} else {\r\n				if (data.length === 0) {\r\n					return 0;\r\n				}\r\n				data = data[0][keys];\r\n				return data[data.length - 1][\'value\'];\r\n			}\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not find key "\' + keys + \'" in JSON: \' + JSON.stringify(data));\r\n			throw \'Could not find required key in JSON object. See logs for more information.\';\r\n		}\r\n	};\r\n}\r\n\r\n\r\nconst params = JSON.parse(value);\r\nvalidateZabbixParams([\'tenancy_ocid\', \'user_ocid\', \'private_key\', \'fingerprint\', \'api_host\', \'http_status_code\'], params);\r\nvar oci = new OCI(\'Block volume\', \'Get volumes\', params);\r\nvar compartments = prepareCompartments(params[\'compartment_ocid\'], params[\'tenancy_ocid\']);\r\n\r\nvar buffer = [];\r\ncompartments.forEach(function (compartment) {\r\n	Array.prototype.push.apply(buffer, oci.extractData(\'get\', oci.executeRequest(\'get\', \'/20160918/volumes\', \'?compartmentId=\' + encodeURIComponent(compartment)), [\'id\', \'displayName\', \'lifecycleState\', \'freeformTags\'], compartment));\r\n})\r\nreturn JSON.stringify(buffer);','','0','','','','','1',NULL,'Discover block volumes.','0','7d','1','',NULL,'10s','','','','200','1','0','','','0','0','0','0','0','0','0','72fa6dfedfd8497298c5930f48594e72','0','2','0'),
('61523','21','','10617','Boot volumes discovery','oci.boot.volumes.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'function validateZabbixParams(requiredParams, allParams) {\r\n	requiredParams.forEach(function (field) {\r\n		if (typeof allParams !== \'object\' || typeof allParams[field] === \'undefined\' || allParams[field] === \'\') {\r\n			throw \'Required param is not set: \' + field + \'.\';\r\n		}\r\n	});\r\n}\r\n\r\nfunction prepareCompartments(compartments, tenancy) {\r\n	if (typeof compartments === \'undefined\' || compartments === \'\') {\r\n		return [tenancy];\r\n	} else {\r\n		return compartments.split(\',\')\r\n	}\r\n}\r\n\r\nfunction OCI(service, action, params) {\r\n	this.zabbixLogPrefix = \'[ OCI ] [ \' + service + \' ] [ \' + action + \' ]\';\r\n	this.request = new HttpRequest();\r\n\r\n	this.hash = function (string) {\r\n		return sha256(string);\r\n	};\r\n\r\n	this.sign = function (string) {\r\n		return sign(\'sha256\', params[\'private_key\'], string);\r\n	};\r\n\r\n	this.encode = function (hash) {\r\n		const hexArr = hash.match(/.{1,2}/g);\r\n		var uInt8Array = new Uint8Array(hexArr.length);\r\n		hexArr.forEach(function (hex, idx) {\r\n			uInt8Array[idx] = parseInt(hex, 16);\r\n		});\r\n		return btoa(uInt8Array);\r\n	};\r\n\r\n	this.getDate = function () {\r\n		const weekdayShortList = [\'Sun\', \'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', \'Sat\'];\r\n		const monthShortList = [\'jan\', \'feb\', \'mar\', \'apr\', \'may\', \'jun\', \'jul\', \'aug\', \'sep\', \'oct\', \'nov\', \'dec\'];\r\n		const today = new Date();\r\n		return weekdayShortList[today.getUTCDay()] + \', \' + today.getUTCDate() + \' \' + monthShortList[today.getUTCMonth()] + \' \' + today.getUTCFullYear() + \' \' + today.getUTCHours() + \':\' + today.getUTCMinutes() + \':\' + today.getUTCSeconds() + \' GMT\';\r\n	};\r\n\r\n	this.executeRequest = function (httpMethod, apiPath, apiParams, mql, namespace) {\r\n		var headers = \'(request-target) date host\';\r\n		const contentTypeHeader = \'content-type: application/json\';\r\n		const dateHeader = \'date: \' + this.getDate();\r\n		const hostHeader = \'host: \' + params[\'api_host\'];\r\n		const requestTarget = \'(request-target): \' + httpMethod + \' \' + apiPath + apiParams;\r\n		var signingString = requestTarget + \'\\n\' + dateHeader + \'\\n\' + hostHeader;\r\n		var reqHeaders = [contentTypeHeader, dateHeader];\r\n\r\n		if (httpMethod === \'post\') {\r\n			var body = JSON.stringify({\r\n				\'namespace\': namespace,\r\n				\'query\': mql\r\n			});\r\n			headers = headers + \' x-content-sha256 content-type content-length\';\r\n			const bodyHeader = \'x-content-sha256: \' + this.encode(this.hash(body));\r\n			const bodyLengthHeader = \'content-length: \' + body.length;\r\n			signingString = signingString + \'\\n\' + bodyHeader + \'\\n\' + contentTypeHeader + \'\\n\' + bodyLengthHeader;\r\n			reqHeaders.push(bodyHeader, bodyLengthHeader);\r\n		}\r\n\r\n		const signature = this.encode(this.sign(signingString));\r\n\r\n		reqHeaders.push(\'Authorization: Signature version="1",keyId="\' + params[\'tenancy_ocid\'] + \'/\' + params[\'user_ocid\'] + \'/\' + params[\'fingerprint\'] + \'",algorithm="rsa-sha256",headers="\' + headers + \'",signature="\' + signature + \'"\');\r\n		for (var header = 0, headerLength = reqHeaders.length; header < headerLength; header++) {\r\n			this.request.addHeader(reqHeaders[header]);\r\n		}\r\n\r\n		if (params[\'http_proxy\']) {\r\n			this.request.setProxy(params[\'http_proxy\']);\r\n			Zabbix.log(4, this.zabbixLogPrefix + \' Using http proxy: \' + params[\'http_proxy\']);\r\n		}\r\n\r\n		if (httpMethod === \'post\') {\r\n			var apiRateLimitExceeded = false;\r\n			do {\r\n				const response = this.request.post(\'https://\' + params[\'api_host\'] + apiPath + apiParams, body);\r\n\r\n				try {\r\n					if (JSON.parse(response)[\'code\'] === \'TooManyRequests\') {\r\n\r\n						apiRateLimitExceeded = true;\r\n						Zabbix.sleep(1000);\r\n					} else {\r\n						apiRateLimitExceeded = false;\r\n					}\r\n				} catch (error) {\r\n					Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the response: \' + JSON.stringify(response));\r\n					throw \'Could not parse the response. See logs for more information.\';\r\n				}\r\n			} while (apiRateLimitExceeded);\r\n		} else {\r\n			const response = this.request.get(\'https://\' + params[\'api_host\'] + apiPath + apiParams);\r\n		}\r\n\r\n		this.request.clearHeader();\r\n\r\n		if (this.request.getStatus() === parseInt(params[\'http_status_code\'])) {\r\n			return response;\r\n		} else {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Unexpected HTTP response code: \' + this.request.getStatus());\r\n			throw \'Unexpected HTTP response code: \' + this.request.getStatus();\r\n		}\r\n	};\r\n\r\n	this.extractData = function (httpMethod, data, keys, compartment) {\r\n		try {\r\n			data = JSON.parse(data);\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the received JSON object: \' + data);\r\n			throw \'Could not parse received JSON object. See logs for more information.\';\r\n		}\r\n\r\n		if (typeof keys == \'object\') {\r\n			var returnBuffer = [];\r\n			for (var dataObj = 0, dataLength = data.length; dataObj < dataLength; dataObj++) {\r\n\r\n				var objectBuffer = {};\r\n				for (var key = 0, keysLength = keys.length; key < keysLength; key++) {\r\n					if (data[dataObj][keys[key]] || data[dataObj][keys[key]] == null) {\r\n						objectBuffer[keys[key].match(/^[a-z]+$|[A-Z][a-z]+$/)[0].toLowerCase()] = data[dataObj][keys[key]];\r\n					} else {\r\n						Zabbix.log(3, this.zabbixLogPrefix + \' Received an unexpected JSON object. Could not get value for key "\' + keys[key] + \'" in JSON: \' + JSON.stringify(data[dataObj]));\r\n						throw \'Received an unexpected JSON object. See logs for more information.\';\r\n					}\r\n				}\r\n				if (typeof compartment != \'undefined\' && compartment != \'\') objectBuffer[\'compartment\'] = compartment;\r\n				returnBuffer.push(objectBuffer);\r\n			}\r\n			return returnBuffer;\r\n		}\r\n\r\n		try {\r\n			if (httpMethod === \'get\') {\r\n				return data[keys];\r\n			} else {\r\n				if (data.length === 0) {\r\n					return 0;\r\n				}\r\n				data = data[0][keys];\r\n				return data[data.length - 1][\'value\'];\r\n			}\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not find key "\' + keys + \'" in JSON: \' + JSON.stringify(data));\r\n			throw \'Could not find required key in JSON object. See logs for more information.\';\r\n		}\r\n	};\r\n}\r\n\r\n\r\nconst params = JSON.parse(value);\r\nvalidateZabbixParams([\'tenancy_ocid\', \'user_ocid\', \'private_key\', \'fingerprint\', \'api_host\', \'http_status_code\'], params);\r\nvar oci = new OCI(\'Boot volume\', \'Get volumes\', params);\r\nvar compartments = prepareCompartments(params[\'compartment_ocid\'], params[\'tenancy_ocid\']);\r\n\r\nvar buffer = [];\r\ncompartments.forEach(function (compartment) {\r\n	Array.prototype.push.apply(buffer, oci.extractData(\'get\', oci.executeRequest(\'get\', \'/20160918/bootVolumes\', \'?compartmentId=\' + encodeURIComponent(compartment)), [\'id\', \'displayName\', \'lifecycleState\', \'freeformTags\'], compartment));\r\n})\r\nreturn JSON.stringify(buffer);','','0','','','','','1',NULL,'Discover boot volumes.','0','7d','1','',NULL,'10s','','','','200','1','0','','','0','0','0','0','0','0','0','90982afdf2f9430bb1c5a3755d8e6c6d','0','2','0'),
('61524','21','','10617','Compute instances discovery','oci.compute.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'function validateZabbixParams(requiredParams, allParams) {\r\n	requiredParams.forEach(function (field) {\r\n		if (typeof allParams !== \'object\' || typeof allParams[field] === \'undefined\' || allParams[field] === \'\') {\r\n			throw \'Required param is not set: \' + field + \'.\';\r\n		}\r\n	});\r\n}\r\n\r\nfunction prepareCompartments(compartments, tenancy) {\r\n	if (typeof compartments === \'undefined\' || compartments === \'\') {\r\n		return [tenancy];\r\n	} else {\r\n		return compartments.split(\',\')\r\n	}\r\n}\r\n\r\nfunction OCI(service, action, params) {\r\n	this.zabbixLogPrefix = \'[ OCI ] [ \' + service + \' ] [ \' + action + \' ]\';\r\n	this.request = new HttpRequest();\r\n\r\n	this.hash = function (string) {\r\n		return sha256(string);\r\n	};\r\n\r\n	this.sign = function (string) {\r\n		return sign(\'sha256\', params[\'private_key\'], string);\r\n	};\r\n\r\n	this.encode = function (hash) {\r\n		const hexArr = hash.match(/.{1,2}/g);\r\n		var uInt8Array = new Uint8Array(hexArr.length);\r\n		hexArr.forEach(function (hex, idx) {\r\n			uInt8Array[idx] = parseInt(hex, 16);\r\n		});\r\n		return btoa(uInt8Array);\r\n	};\r\n\r\n	this.getDate = function () {\r\n		const weekdayShortList = [\'Sun\', \'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', \'Sat\'];\r\n		const monthShortList = [\'jan\', \'feb\', \'mar\', \'apr\', \'may\', \'jun\', \'jul\', \'aug\', \'sep\', \'oct\', \'nov\', \'dec\'];\r\n		const today = new Date();\r\n		return weekdayShortList[today.getUTCDay()] + \', \' + today.getUTCDate() + \' \' + monthShortList[today.getUTCMonth()] + \' \' + today.getUTCFullYear() + \' \' + today.getUTCHours() + \':\' + today.getUTCMinutes() + \':\' + today.getUTCSeconds() + \' GMT\';\r\n	};\r\n\r\n	this.executeRequest = function (httpMethod, apiPath, apiParams, mql, namespace) {\r\n		var headers = \'(request-target) date host\';\r\n		const contentTypeHeader = \'content-type: application/json\';\r\n		const dateHeader = \'date: \' + this.getDate();\r\n		const hostHeader = \'host: \' + params[\'api_host\'];\r\n		const requestTarget = \'(request-target): \' + httpMethod + \' \' + apiPath + apiParams;\r\n		var signingString = requestTarget + \'\\n\' + dateHeader + \'\\n\' + hostHeader;\r\n		var reqHeaders = [contentTypeHeader, dateHeader];\r\n\r\n		if (httpMethod === \'post\') {\r\n			var body = JSON.stringify({\r\n				\'namespace\': namespace,\r\n				\'query\': mql\r\n			});\r\n			headers = headers + \' x-content-sha256 content-type content-length\';\r\n			const bodyHeader = \'x-content-sha256: \' + this.encode(this.hash(body));\r\n			const bodyLengthHeader = \'content-length: \' + body.length;\r\n			signingString = signingString + \'\\n\' + bodyHeader + \'\\n\' + contentTypeHeader + \'\\n\' + bodyLengthHeader;\r\n			reqHeaders.push(bodyHeader, bodyLengthHeader);\r\n		}\r\n\r\n		const signature = this.encode(this.sign(signingString));\r\n\r\n		reqHeaders.push(\'Authorization: Signature version="1",keyId="\' + params[\'tenancy_ocid\'] + \'/\' + params[\'user_ocid\'] + \'/\' + params[\'fingerprint\'] + \'",algorithm="rsa-sha256",headers="\' + headers + \'",signature="\' + signature + \'"\');\r\n		for (var header = 0, headerLength = reqHeaders.length; header < headerLength; header++) {\r\n			this.request.addHeader(reqHeaders[header]);\r\n		}\r\n\r\n		if (params[\'http_proxy\']) {\r\n			this.request.setProxy(params[\'http_proxy\']);\r\n			Zabbix.log(4, this.zabbixLogPrefix + \' Using http proxy: \' + params[\'http_proxy\']);\r\n		}\r\n\r\n		if (httpMethod === \'post\') {\r\n			var apiRateLimitExceeded = false;\r\n			do {\r\n				const response = this.request.post(\'https://\' + params[\'api_host\'] + apiPath + apiParams, body);\r\n\r\n				try {\r\n					if (JSON.parse(response)[\'code\'] === \'TooManyRequests\') {\r\n\r\n						apiRateLimitExceeded = true;\r\n						Zabbix.sleep(1000);\r\n					} else {\r\n						apiRateLimitExceeded = false;\r\n					}\r\n				} catch (error) {\r\n					Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the response: \' + JSON.stringify(response));\r\n					throw \'Could not parse the response. See logs for more information.\';\r\n				}\r\n			} while (apiRateLimitExceeded);\r\n		} else {\r\n			const response = this.request.get(\'https://\' + params[\'api_host\'] + apiPath + apiParams);\r\n		}\r\n\r\n		this.request.clearHeader();\r\n\r\n		if (this.request.getStatus() === parseInt(params[\'http_status_code\'])) {\r\n			return response;\r\n		} else {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Unexpected HTTP response code: \' + this.request.getStatus());\r\n			throw \'Unexpected HTTP response code: \' + this.request.getStatus();\r\n		}\r\n	};\r\n\r\n	this.extractData = function (httpMethod, data, keys, compartment) {\r\n		try {\r\n			data = JSON.parse(data);\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the received JSON object: \' + data);\r\n			throw \'Could not parse received JSON object. See logs for more information.\';\r\n		}\r\n\r\n		if (typeof keys == \'object\') {\r\n			var returnBuffer = [];\r\n			for (var dataObj = 0, dataLength = data.length; dataObj < dataLength; dataObj++) {\r\n\r\n				var objectBuffer = {};\r\n				for (var key = 0, keysLength = keys.length; key < keysLength; key++) {\r\n					if (data[dataObj][keys[key]] || data[dataObj][keys[key]] == null) {\r\n						objectBuffer[keys[key].match(/^[a-z]+$|[A-Z][a-z]+$/)[0].toLowerCase()] = data[dataObj][keys[key]];\r\n					} else {\r\n						Zabbix.log(3, this.zabbixLogPrefix + \' Received an unexpected JSON object. Could not get value for key "\' + keys[key] + \'" in JSON: \' + JSON.stringify(data[dataObj]));\r\n						throw \'Received an unexpected JSON object. See logs for more information.\';\r\n					}\r\n				}\r\n				if (typeof compartment != \'undefined\' && compartment != \'\') objectBuffer[\'compartment\'] = compartment;\r\n				returnBuffer.push(objectBuffer);\r\n			}\r\n			return returnBuffer;\r\n		}\r\n\r\n		try {\r\n			if (httpMethod === \'get\') {\r\n				return data[keys];\r\n			} else {\r\n				if (data.length === 0) {\r\n					return 0;\r\n				}\r\n				data = data[0][keys];\r\n				return data[data.length - 1][\'value\'];\r\n			}\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not find key "\' + keys + \'" in JSON: \' + JSON.stringify(data));\r\n			throw \'Could not find required key in JSON object. See logs for more information.\';\r\n		}\r\n	};\r\n}\r\n\r\n\r\nconst params = JSON.parse(value);\r\nvalidateZabbixParams([\'tenancy_ocid\', \'user_ocid\', \'private_key\', \'fingerprint\', \'api_host\', \'http_status_code\'], params);\r\nvar oci = new OCI(\'Compute\', \'Get instances\', params);\r\nvar compartments = prepareCompartments(params[\'compartment_ocid\'], params[\'tenancy_ocid\']);\r\n\r\nvar buffer = [];\r\ncompartments.forEach(function (compartment) {\r\n	Array.prototype.push.apply(buffer, oci.extractData(\'get\', oci.executeRequest(\'get\', \'/20160918/instances\', \'?compartmentId=\' + encodeURIComponent(compartment)), [\'id\', \'displayName\', \'lifecycleState\', \'freeformTags\', \'availabilityDomain\'], compartment));\r\n})\r\nreturn JSON.stringify(buffer);','','0','','','','','1',NULL,'Discover compute instances.','0','7d','1','',NULL,'10s','','','','200','1','0','','','0','0','0','0','0','0','0','ea4bbd0e9737406693aa0051cf861115','0','2','0'),
('61525','21','','10617','Autonomous database discovery','oci.object.autonomous.db.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'function validateZabbixParams(requiredParams, allParams) {\r\n	requiredParams.forEach(function (field) {\r\n		if (typeof allParams !== \'object\' || typeof allParams[field] === \'undefined\' || allParams[field] === \'\') {\r\n			throw \'Required param is not set: \' + field + \'.\';\r\n		}\r\n	});\r\n}\r\n\r\nfunction prepareCompartments(compartments, tenancy) {\r\n	if (typeof compartments === \'undefined\' || compartments === \'\') {\r\n		return [tenancy];\r\n	} else {\r\n		return compartments.split(\',\')\r\n	}\r\n}\r\n\r\nfunction OCI(service, action, params) {\r\n	this.zabbixLogPrefix = \'[ OCI ] [ \' + service + \' ] [ \' + action + \' ]\';\r\n	this.request = new HttpRequest();\r\n\r\n	this.hash = function (string) {\r\n		return sha256(string);\r\n	};\r\n\r\n	this.sign = function (string) {\r\n		return sign(\'sha256\', params[\'private_key\'], string);\r\n	};\r\n\r\n	this.encode = function (hash) {\r\n		const hexArr = hash.match(/.{1,2}/g);\r\n		var uInt8Array = new Uint8Array(hexArr.length);\r\n		hexArr.forEach(function (hex, idx) {\r\n			uInt8Array[idx] = parseInt(hex, 16);\r\n		});\r\n		return btoa(uInt8Array);\r\n	};\r\n\r\n	this.getDate = function () {\r\n		const weekdayShortList = [\'Sun\', \'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', \'Sat\'];\r\n		const monthShortList = [\'jan\', \'feb\', \'mar\', \'apr\', \'may\', \'jun\', \'jul\', \'aug\', \'sep\', \'oct\', \'nov\', \'dec\'];\r\n		const today = new Date();\r\n		return weekdayShortList[today.getUTCDay()] + \', \' + today.getUTCDate() + \' \' + monthShortList[today.getUTCMonth()] + \' \' + today.getUTCFullYear() + \' \' + today.getUTCHours() + \':\' + today.getUTCMinutes() + \':\' + today.getUTCSeconds() + \' GMT\';\r\n	};\r\n\r\n	this.executeRequest = function (httpMethod, apiPath, apiParams, mql, namespace) {\r\n		var headers = \'(request-target) date host\';\r\n		const contentTypeHeader = \'content-type: application/json\';\r\n		const dateHeader = \'date: \' + this.getDate();\r\n		const hostHeader = \'host: \' + params[\'api_host\'];\r\n		const requestTarget = \'(request-target): \' + httpMethod + \' \' + apiPath + apiParams;\r\n		var signingString = requestTarget + \'\\n\' + dateHeader + \'\\n\' + hostHeader;\r\n		var reqHeaders = [contentTypeHeader, dateHeader];\r\n\r\n		if (httpMethod === \'post\') {\r\n			var body = JSON.stringify({\r\n				\'namespace\': namespace,\r\n				\'query\': mql\r\n			});\r\n			headers = headers + \' x-content-sha256 content-type content-length\';\r\n			const bodyHeader = \'x-content-sha256: \' + this.encode(this.hash(body));\r\n			const bodyLengthHeader = \'content-length: \' + body.length;\r\n			signingString = signingString + \'\\n\' + bodyHeader + \'\\n\' + contentTypeHeader + \'\\n\' + bodyLengthHeader;\r\n			reqHeaders.push(bodyHeader, bodyLengthHeader);\r\n		}\r\n\r\n		const signature = this.encode(this.sign(signingString));\r\n\r\n		reqHeaders.push(\'Authorization: Signature version="1",keyId="\' + params[\'tenancy_ocid\'] + \'/\' + params[\'user_ocid\'] + \'/\' + params[\'fingerprint\'] + \'",algorithm="rsa-sha256",headers="\' + headers + \'",signature="\' + signature + \'"\');\r\n		for (var header = 0, headerLength = reqHeaders.length; header < headerLength; header++) {\r\n			this.request.addHeader(reqHeaders[header]);\r\n		}\r\n\r\n		if (params[\'http_proxy\']) {\r\n			this.request.setProxy(params[\'http_proxy\']);\r\n			Zabbix.log(4, this.zabbixLogPrefix + \' Using http proxy: \' + params[\'http_proxy\']);\r\n		}\r\n\r\n		if (httpMethod === \'post\') {\r\n			var apiRateLimitExceeded = false;\r\n			do {\r\n				const response = this.request.post(\'https://\' + params[\'api_host\'] + apiPath + apiParams, body);\r\n\r\n				try {\r\n					if (JSON.parse(response)[\'code\'] === \'TooManyRequests\') {\r\n\r\n						apiRateLimitExceeded = true;\r\n						Zabbix.sleep(1000);\r\n					} else {\r\n						apiRateLimitExceeded = false;\r\n					}\r\n				} catch (error) {\r\n					Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the response: \' + JSON.stringify(response));\r\n					throw \'Could not parse the response. See logs for more information.\';\r\n				}\r\n			} while (apiRateLimitExceeded);\r\n		} else {\r\n			const response = this.request.get(\'https://\' + params[\'api_host\'] + apiPath + apiParams);\r\n		}\r\n\r\n		this.request.clearHeader();\r\n\r\n		if (this.request.getStatus() === parseInt(params[\'http_status_code\'])) {\r\n			return response;\r\n		} else {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Unexpected HTTP response code: \' + this.request.getStatus());\r\n			throw \'Unexpected HTTP response code: \' + this.request.getStatus();\r\n		}\r\n	};\r\n\r\n	this.extractData = function (httpMethod, data, keys, compartment) {\r\n		try {\r\n			data = JSON.parse(data);\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the received JSON object: \' + data);\r\n			throw \'Could not parse received JSON object. See logs for more information.\';\r\n		}\r\n\r\n		if (typeof keys == \'object\') {\r\n			var returnBuffer = [];\r\n			for (var dataObj = 0, dataLength = data.length; dataObj < dataLength; dataObj++) {\r\n\r\n				var objectBuffer = {};\r\n				for (var key = 0, keysLength = keys.length; key < keysLength; key++) {\r\n					if (data[dataObj][keys[key]] || data[dataObj][keys[key]] == null) {\r\n						objectBuffer[keys[key].match(/^[a-z]+$|[A-Z][a-z]+$/)[0].toLowerCase()] = data[dataObj][keys[key]];\r\n					} else {\r\n						Zabbix.log(3, this.zabbixLogPrefix + \' Received an unexpected JSON object. Could not get value for key "\' + keys[key] + \'" in JSON: \' + JSON.stringify(data[dataObj]));\r\n						throw \'Received an unexpected JSON object. See logs for more information.\';\r\n					}\r\n				}\r\n				if (typeof compartment != \'undefined\' && compartment != \'\') objectBuffer[\'compartment\'] = compartment;\r\n				returnBuffer.push(objectBuffer);\r\n			}\r\n			return returnBuffer;\r\n		}\r\n\r\n		try {\r\n			if (httpMethod === \'get\') {\r\n				return data[keys];\r\n			} else {\r\n				if (data.length === 0) {\r\n					return 0;\r\n				}\r\n				data = data[0][keys];\r\n				return data[data.length - 1][\'value\'];\r\n			}\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not find key "\' + keys + \'" in JSON: \' + JSON.stringify(data));\r\n			throw \'Could not find required key in JSON object. See logs for more information.\';\r\n		}\r\n	};\r\n}\r\n\r\n\r\nconst params = JSON.parse(value);\r\nvalidateZabbixParams([\'tenancy_ocid\', \'user_ocid\', \'private_key\', \'fingerprint\', \'api_host\', \'http_status_code\'], params);\r\nvar oci = new OCI(\'Autonomous DB\', \'Get DBs\', params);\r\nvar compartments = prepareCompartments(params[\'compartment_ocid\'], params[\'tenancy_ocid\']);\r\n\r\nvar buffer = [];\r\ncompartments.forEach(function (compartment) {\r\n	Array.prototype.push.apply(buffer, oci.extractData(\'get\', oci.executeRequest(\'get\', \'/20160918/autonomousDatabases\', \'?compartmentId=\' + encodeURIComponent(compartment)), [\'id\', \'dbName\', \'lifecycleState\', \'freeformTags\'], compartment));\r\n})\r\nreturn JSON.stringify(buffer);','','0','','','','','1',NULL,'Discover autonomous databases.','0','7d','1','',NULL,'10s','','','','200','1','0','','','0','0','0','0','0','0','0','c69611c5b86043b28c8ce2bc0627b377','0','2','0'),
('61526','21','','10617','Object storage discovery','oci.object.storage.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'function validateZabbixParams(requiredParams, allParams) {\r\n	requiredParams.forEach(function (field) {\r\n		if (typeof allParams !== \'object\' || typeof allParams[field] === \'undefined\' || allParams[field] === \'\') {\r\n			throw \'Required param is not set: \' + field + \'.\';\r\n		}\r\n	});\r\n}\r\n\r\nfunction prepareCompartments(compartments, tenancy) {\r\n	if (typeof compartments === \'undefined\' || compartments === \'\') {\r\n		return [tenancy];\r\n	} else {\r\n		return compartments.split(\',\')\r\n	}\r\n}\r\n\r\nfunction OCI(service, action, params) {\r\n	this.zabbixLogPrefix = \'[ OCI ] [ \' + service + \' ] [ \' + action + \' ]\';\r\n	this.request = new HttpRequest();\r\n\r\n	this.hash = function (string) {\r\n		return sha256(string);\r\n	};\r\n\r\n	this.sign = function (string) {\r\n		return sign(\'sha256\', params[\'private_key\'], string);\r\n	};\r\n\r\n	this.encode = function (hash) {\r\n		const hexArr = hash.match(/.{1,2}/g);\r\n		var uInt8Array = new Uint8Array(hexArr.length);\r\n		hexArr.forEach(function (hex, idx) {\r\n			uInt8Array[idx] = parseInt(hex, 16);\r\n		});\r\n		return btoa(uInt8Array);\r\n	};\r\n\r\n	this.getDate = function () {\r\n		const weekdayShortList = [\'Sun\', \'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', \'Sat\'];\r\n		const monthShortList = [\'jan\', \'feb\', \'mar\', \'apr\', \'may\', \'jun\', \'jul\', \'aug\', \'sep\', \'oct\', \'nov\', \'dec\'];\r\n		const today = new Date();\r\n		return weekdayShortList[today.getUTCDay()] + \', \' + today.getUTCDate() + \' \' + monthShortList[today.getUTCMonth()] + \' \' + today.getUTCFullYear() + \' \' + today.getUTCHours() + \':\' + today.getUTCMinutes() + \':\' + today.getUTCSeconds() + \' GMT\';\r\n	};\r\n\r\n	this.executeRequest = function (httpMethod, apiPath, apiParams, mql, namespace) {\r\n		var headers = \'(request-target) date host\';\r\n		const contentTypeHeader = \'content-type: application/json\';\r\n		const dateHeader = \'date: \' + this.getDate();\r\n		const hostHeader = \'host: \' + params[\'api_host\'];\r\n		const requestTarget = \'(request-target): \' + httpMethod + \' \' + apiPath + apiParams;\r\n		var signingString = requestTarget + \'\\n\' + dateHeader + \'\\n\' + hostHeader;\r\n		var reqHeaders = [contentTypeHeader, dateHeader];\r\n\r\n		if (httpMethod === \'post\') {\r\n			var body = JSON.stringify({\r\n				\'namespace\': namespace,\r\n				\'query\': mql\r\n			});\r\n			headers = headers + \' x-content-sha256 content-type content-length\';\r\n			const bodyHeader = \'x-content-sha256: \' + this.encode(this.hash(body));\r\n			const bodyLengthHeader = \'content-length: \' + body.length;\r\n			signingString = signingString + \'\\n\' + bodyHeader + \'\\n\' + contentTypeHeader + \'\\n\' + bodyLengthHeader;\r\n			reqHeaders.push(bodyHeader, bodyLengthHeader);\r\n		}\r\n\r\n		const signature = this.encode(this.sign(signingString));\r\n\r\n		reqHeaders.push(\'Authorization: Signature version="1",keyId="\' + params[\'tenancy_ocid\'] + \'/\' + params[\'user_ocid\'] + \'/\' + params[\'fingerprint\'] + \'",algorithm="rsa-sha256",headers="\' + headers + \'",signature="\' + signature + \'"\');\r\n		for (var header = 0, headerLength = reqHeaders.length; header < headerLength; header++) {\r\n			this.request.addHeader(reqHeaders[header]);\r\n		}\r\n\r\n		if (params[\'http_proxy\']) {\r\n			this.request.setProxy(params[\'http_proxy\']);\r\n			Zabbix.log(4, this.zabbixLogPrefix + \' Using http proxy: \' + params[\'http_proxy\']);\r\n		}\r\n\r\n		if (httpMethod === \'post\') {\r\n			var apiRateLimitExceeded = false;\r\n			do {\r\n				const response = this.request.post(\'https://\' + params[\'api_host\'] + apiPath + apiParams, body);\r\n\r\n				try {\r\n					if (JSON.parse(response)[\'code\'] === \'TooManyRequests\') {\r\n\r\n						apiRateLimitExceeded = true;\r\n						Zabbix.sleep(1000);\r\n					} else {\r\n						apiRateLimitExceeded = false;\r\n					}\r\n				} catch (error) {\r\n					Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the response: \' + JSON.stringify(response));\r\n					throw \'Could not parse the response. See logs for more information.\';\r\n				}\r\n			} while (apiRateLimitExceeded);\r\n		} else {\r\n			const response = this.request.get(\'https://\' + params[\'api_host\'] + apiPath + apiParams);\r\n		}\r\n\r\n		this.request.clearHeader();\r\n\r\n		if (this.request.getStatus() === parseInt(params[\'http_status_code\'])) {\r\n			return response;\r\n		} else {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Unexpected HTTP response code: \' + this.request.getStatus());\r\n			throw \'Unexpected HTTP response code: \' + this.request.getStatus();\r\n		}\r\n	};\r\n\r\n	this.extractData = function (httpMethod, data, keys, compartment) {\r\n		try {\r\n			data = JSON.parse(data);\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the received JSON object: \' + data);\r\n			throw \'Could not parse received JSON object. See logs for more information.\';\r\n		}\r\n\r\n		if (typeof keys == \'object\') {\r\n			var returnBuffer = [];\r\n			for (var dataObj = 0, dataLength = data.length; dataObj < dataLength; dataObj++) {\r\n\r\n				var objectBuffer = {};\r\n				for (var key = 0, keysLength = keys.length; key < keysLength; key++) {\r\n					if (data[dataObj][keys[key]] || data[dataObj][keys[key]] == null) {\r\n						objectBuffer[keys[key].match(/^[a-z]+$|[A-Z][a-z]+$/)[0].toLowerCase()] = data[dataObj][keys[key]];\r\n					} else {\r\n						Zabbix.log(3, this.zabbixLogPrefix + \' Received an unexpected JSON object. Could not get value for key "\' + keys[key] + \'" in JSON: \' + JSON.stringify(data[dataObj]));\r\n						throw \'Received an unexpected JSON object. See logs for more information.\';\r\n					}\r\n				}\r\n				if (typeof compartment != \'undefined\' && compartment != \'\') objectBuffer[\'compartment\'] = compartment;\r\n				returnBuffer.push(objectBuffer);\r\n			}\r\n			return returnBuffer;\r\n		}\r\n\r\n		try {\r\n			if (httpMethod === \'get\') {\r\n				return data[keys];\r\n			} else {\r\n				if (data.length === 0) {\r\n					return 0;\r\n				}\r\n				data = data[0][keys];\r\n				return data[data.length - 1][\'value\'];\r\n			}\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not find key "\' + keys + \'" in JSON: \' + JSON.stringify(data));\r\n			throw \'Could not find required key in JSON object. See logs for more information.\';\r\n		}\r\n	};\r\n}\r\n\r\n\r\nconst params = JSON.parse(value);\r\nvalidateZabbixParams([\'tenancy_ocid\', \'user_ocid\', \'private_key\', \'fingerprint\', \'api_host\', \'http_status_code\'], params);\r\nvar oci = new OCI(\'Object storage\', \'Get buckets\', params);\r\nvar compartments = prepareCompartments(params[\'compartment_ocid\'], params[\'tenancy_ocid\']);\r\nconst namespace = JSON.parse(oci.executeRequest(\'get\', \'/n\', \'\'));\r\n\r\nvar buffer = [];\r\ncompartments.forEach(function (compartment) {\r\n	Array.prototype.push.apply(buffer, oci.extractData(\'get\', oci.executeRequest(\'get\', \'/n/\' + encodeURIComponent(namespace) + \'/b/\', \'?compartmentId=\' + encodeURIComponent(compartment) + \'&fields=tags\'), [\'name\', \'freeformTags\'], compartment));\r\n})\r\nreturn JSON.stringify(buffer);','','0','','','','','1',NULL,'Discover object storage.','0','7d','1','',NULL,'10s','','','','200','1','0','','','0','0','0','0','0','0','0','e1949f127af04efeb8c192f23e45b58a','0','2','0'),
('61527','21','','10617','Virtual cloud networks discovery','oci.vcn.discovery','1h','31d','365d','0','4','','','','',NULL,NULL,'function validateZabbixParams(requiredParams, allParams) {\r\n	requiredParams.forEach(function (field) {\r\n		if (typeof allParams !== \'object\' || typeof allParams[field] === \'undefined\' || allParams[field] === \'\') {\r\n			throw \'Required param is not set: \' + field + \'.\';\r\n		}\r\n	});\r\n}\r\n\r\nfunction prepareCompartments(compartments, tenancy) {\r\n	if (typeof compartments === \'undefined\' || compartments === \'\') {\r\n		return [tenancy];\r\n	} else {\r\n		return compartments.split(\',\')\r\n	}\r\n}\r\n\r\nfunction OCI(service, action, params) {\r\n	this.zabbixLogPrefix = \'[ OCI ] [ \' + service + \' ] [ \' + action + \' ]\';\r\n	this.request = new HttpRequest();\r\n\r\n	this.hash = function (string) {\r\n		return sha256(string);\r\n	};\r\n\r\n	this.sign = function (string) {\r\n		return sign(\'sha256\', params[\'private_key\'], string);\r\n	};\r\n\r\n	this.encode = function (hash) {\r\n		const hexArr = hash.match(/.{1,2}/g);\r\n		var uInt8Array = new Uint8Array(hexArr.length);\r\n		hexArr.forEach(function (hex, idx) {\r\n			uInt8Array[idx] = parseInt(hex, 16);\r\n		});\r\n		return btoa(uInt8Array);\r\n	};\r\n\r\n	this.getDate = function () {\r\n		const weekdayShortList = [\'Sun\', \'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', \'Sat\'];\r\n		const monthShortList = [\'jan\', \'feb\', \'mar\', \'apr\', \'may\', \'jun\', \'jul\', \'aug\', \'sep\', \'oct\', \'nov\', \'dec\'];\r\n		const today = new Date();\r\n		return weekdayShortList[today.getUTCDay()] + \', \' + today.getUTCDate() + \' \' + monthShortList[today.getUTCMonth()] + \' \' + today.getUTCFullYear() + \' \' + today.getUTCHours() + \':\' + today.getUTCMinutes() + \':\' + today.getUTCSeconds() + \' GMT\';\r\n	};\r\n\r\n	this.executeRequest = function (httpMethod, apiPath, apiParams, mql, namespace) {\r\n		var headers = \'(request-target) date host\';\r\n		const contentTypeHeader = \'content-type: application/json\';\r\n		const dateHeader = \'date: \' + this.getDate();\r\n		const hostHeader = \'host: \' + params[\'api_host\'];\r\n		const requestTarget = \'(request-target): \' + httpMethod + \' \' + apiPath + apiParams;\r\n		var signingString = requestTarget + \'\\n\' + dateHeader + \'\\n\' + hostHeader;\r\n		var reqHeaders = [contentTypeHeader, dateHeader];\r\n\r\n		if (httpMethod === \'post\') {\r\n			var body = JSON.stringify({\r\n				\'namespace\': namespace,\r\n				\'query\': mql\r\n			});\r\n			headers = headers + \' x-content-sha256 content-type content-length\';\r\n			const bodyHeader = \'x-content-sha256: \' + this.encode(this.hash(body));\r\n			const bodyLengthHeader = \'content-length: \' + body.length;\r\n			signingString = signingString + \'\\n\' + bodyHeader + \'\\n\' + contentTypeHeader + \'\\n\' + bodyLengthHeader;\r\n			reqHeaders.push(bodyHeader, bodyLengthHeader);\r\n		}\r\n\r\n		const signature = this.encode(this.sign(signingString));\r\n\r\n		reqHeaders.push(\'Authorization: Signature version="1",keyId="\' + params[\'tenancy_ocid\'] + \'/\' + params[\'user_ocid\'] + \'/\' + params[\'fingerprint\'] + \'",algorithm="rsa-sha256",headers="\' + headers + \'",signature="\' + signature + \'"\');\r\n		for (var header = 0, headerLength = reqHeaders.length; header < headerLength; header++) {\r\n			this.request.addHeader(reqHeaders[header]);\r\n		}\r\n\r\n		if (params[\'http_proxy\']) {\r\n			this.request.setProxy(params[\'http_proxy\']);\r\n			Zabbix.log(4, this.zabbixLogPrefix + \' Using http proxy: \' + params[\'http_proxy\']);\r\n		}\r\n\r\n		if (httpMethod === \'post\') {\r\n			var apiRateLimitExceeded = false;\r\n			do {\r\n				const response = this.request.post(\'https://\' + params[\'api_host\'] + apiPath + apiParams, body);\r\n\r\n				try {\r\n					if (JSON.parse(response)[\'code\'] === \'TooManyRequests\') {\r\n\r\n						apiRateLimitExceeded = true;\r\n						Zabbix.sleep(1000);\r\n					} else {\r\n						apiRateLimitExceeded = false;\r\n					}\r\n				} catch (error) {\r\n					Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the response: \' + JSON.stringify(response));\r\n					throw \'Could not parse the response. See logs for more information.\';\r\n				}\r\n			} while (apiRateLimitExceeded);\r\n		} else {\r\n			const response = this.request.get(\'https://\' + params[\'api_host\'] + apiPath + apiParams);\r\n		}\r\n\r\n		this.request.clearHeader();\r\n\r\n		if (this.request.getStatus() === parseInt(params[\'http_status_code\'])) {\r\n			return response;\r\n		} else {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Unexpected HTTP response code: \' + this.request.getStatus());\r\n			throw \'Unexpected HTTP response code: \' + this.request.getStatus();\r\n		}\r\n	};\r\n\r\n	this.extractData = function (httpMethod, data, keys, compartment) {\r\n		try {\r\n			data = JSON.parse(data);\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the received JSON object: \' + data);\r\n			throw \'Could not parse received JSON object. See logs for more information.\';\r\n		}\r\n\r\n		if (typeof keys == \'object\') {\r\n			var returnBuffer = [];\r\n			for (var dataObj = 0, dataLength = data.length; dataObj < dataLength; dataObj++) {\r\n\r\n				var objectBuffer = {};\r\n				for (var key = 0, keysLength = keys.length; key < keysLength; key++) {\r\n					if (data[dataObj][keys[key]] || data[dataObj][keys[key]] == null) {\r\n						objectBuffer[keys[key].match(/^[a-z]+$|[A-Z][a-z]+$/)[0].toLowerCase()] = data[dataObj][keys[key]];\r\n					} else {\r\n						Zabbix.log(3, this.zabbixLogPrefix + \' Received an unexpected JSON object. Could not get value for key "\' + keys[key] + \'" in JSON: \' + JSON.stringify(data[dataObj]));\r\n						throw \'Received an unexpected JSON object. See logs for more information.\';\r\n					}\r\n				}\r\n				if (typeof compartment != \'undefined\' && compartment != \'\') objectBuffer[\'compartment\'] = compartment;\r\n				returnBuffer.push(objectBuffer);\r\n			}\r\n			return returnBuffer;\r\n		}\r\n\r\n		try {\r\n			if (httpMethod === \'get\') {\r\n				return data[keys];\r\n			} else {\r\n				if (data.length === 0) {\r\n					return 0;\r\n				}\r\n				data = data[0][keys];\r\n				return data[data.length - 1][\'value\'];\r\n			}\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not find key "\' + keys + \'" in JSON: \' + JSON.stringify(data));\r\n			throw \'Could not find required key in JSON object. See logs for more information.\';\r\n		}\r\n	};\r\n}\r\n\r\n\r\nconst params = JSON.parse(value);\r\nvalidateZabbixParams([\'tenancy_ocid\', \'user_ocid\', \'private_key\', \'fingerprint\', \'api_host\', \'http_status_code\'], params);\r\nvar oci = new OCI(\'VCN\', \'Get VCNs\', params);\r\nvar compartments = prepareCompartments(params[\'compartment_ocid\'], params[\'tenancy_ocid\']);\r\n\r\nvar buffer = [];\r\ncompartments.forEach(function (compartment) {\r\n	Array.prototype.push.apply(buffer, oci.extractData(\'get\', oci.executeRequest(\'get\', \'/20160918/vcns\', \'?compartmentId=\' + encodeURIComponent(compartment)), [\'id\', \'displayName\', \'lifecycleState\', \'freeformTags\'], compartment));\r\n})\r\nreturn JSON.stringify(buffer);','','0','','','','','1',NULL,'Discover virtual cloud networks (VCNs).','0','7d','1','',NULL,'10s','','','','200','1','0','','','0','0','0','0','0','0','0','378d760173924bf48fbc25c74a520a8b','0','2','0'),
('61530','21','','10618','VNIC [{#NAME}]: Get metrics','oci.compute.vnic.metrics.get[{#ID}]','1m','0','0','0','4','','','','',NULL,NULL,'function validateZabbixParams(requiredParams, allParams) {\r\n	requiredParams.forEach(function (field) {\r\n		if (typeof allParams !== \'object\' || typeof allParams[field] === \'undefined\' || allParams[field] === \'\') {\r\n			throw \'Required param is not set: \' + field + \'.\';\r\n		}\r\n	});\r\n}\r\n\r\nfunction OCI(service, action, params) {\r\n	this.zabbixLogPrefix = \'[ OCI ] [ \' + service + \' ] [ \' + action + \' ]\';\r\n	this.request = new HttpRequest();\r\n\r\n	this.hash = function (string) {\r\n		return sha256(string);\r\n	};\r\n\r\n	this.sign = function (string) {\r\n		return sign(\'sha256\', params[\'private_key\'], string);\r\n	};\r\n\r\n	this.encode = function (hash) {\r\n		const hexArr = hash.match(/.{1,2}/g);\r\n		var uInt8Array = new Uint8Array(hexArr.length);\r\n		hexArr.forEach(function (hex, idx) {\r\n			uInt8Array[idx] = parseInt(hex, 16);\r\n		});\r\n		return btoa(uInt8Array);\r\n	};\r\n\r\n	this.getDate = function () {\r\n		const weekdayShortList = [\'Sun\', \'Mon\', \'Tue\', \'Wed\', \'Thu\', \'Fri\', \'Sat\'];\r\n		const monthShortList = [\'jan\', \'feb\', \'mar\', \'apr\', \'may\', \'jun\', \'jul\', \'aug\', \'sep\', \'oct\', \'nov\', \'dec\'];\r\n		const today = new Date();\r\n		return weekdayShortList[today.getUTCDay()] + \', \' + today.getUTCDate() + \' \' + monthShortList[today.getUTCMonth()] + \' \' + today.getUTCFullYear() + \' \' + today.getUTCHours() + \':\' + today.getUTCMinutes() + \':\' + today.getUTCSeconds() + \' GMT\';\r\n	};\r\n\r\n	this.executeRequest = function (httpMethod, apiPath, apiParams, mql, namespace) {\r\n		var headers = \'(request-target) date host\';\r\n		const contentTypeHeader = \'content-type: application/json\';\r\n		const dateHeader = \'date: \' + this.getDate();\r\n		const hostHeader = \'host: \' + params[\'api_host\'];\r\n		const requestTarget = \'(request-target): \' + httpMethod + \' \' + apiPath + apiParams;\r\n		var signingString = requestTarget + \'\\n\' + dateHeader + \'\\n\' + hostHeader;\r\n		var reqHeaders = [contentTypeHeader, dateHeader];\r\n\r\n		if (httpMethod === \'post\') {\r\n			var body = JSON.stringify({\r\n				\'namespace\': namespace,\r\n				\'query\': mql\r\n			});\r\n			headers = headers + \' x-content-sha256 content-type content-length\';\r\n			const bodyHeader = \'x-content-sha256: \' + this.encode(this.hash(body));\r\n			const bodyLengthHeader = \'content-length: \' + body.length;\r\n			signingString = signingString + \'\\n\' + bodyHeader + \'\\n\' + contentTypeHeader + \'\\n\' + bodyLengthHeader;\r\n			reqHeaders.push(bodyHeader, bodyLengthHeader);\r\n		}\r\n\r\n		const signature = this.encode(this.sign(signingString));\r\n\r\n		reqHeaders.push(\'Authorization: Signature version="1",keyId="\' + params[\'tenancy_ocid\'] + \'/\' + params[\'user_ocid\'] + \'/\' + params[\'fingerprint\'] + \'",algorithm="rsa-sha256",headers="\' + headers + \'",signature="\' + signature + \'"\');\r\n		for (var header = 0, headerLength = reqHeaders.length; header < headerLength; header++) {\r\n			this.request.addHeader(reqHeaders[header]);\r\n		}\r\n\r\n		if (params[\'http_proxy\']) {\r\n			this.request.setProxy(params[\'http_proxy\']);\r\n			Zabbix.log(4, this.zabbixLogPrefix + \' Using http proxy: \' + params[\'http_proxy\']);\r\n		}\r\n\r\n		if (httpMethod === \'post\') {\r\n			var apiRateLimitExceeded = false;\r\n			do {\r\n				const response = this.request.post(\'https://\' + params[\'api_host\'] + apiPath + apiParams, body);\r\n\r\n				try {\r\n					if (JSON.parse(response)[\'code\'] === \'TooManyRequests\') {\r\n\r\n						apiRateLimitExceeded = true;\r\n						Zabbix.sleep(1000);\r\n					} else {\r\n						apiRateLimitExceeded = false;\r\n					}\r\n				} catch (error) {\r\n					Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the response: \' + JSON.stringify(response));\r\n					throw \'Could not parse the response. See logs for more information.\';\r\n				}\r\n			} while (apiRateLimitExceeded);\r\n		} else {\r\n			const response = this.request.get(\'https://\' + params[\'api_host\'] + apiPath + apiParams);\r\n		}\r\n\r\n		this.request.clearHeader();\r\n\r\n		if (this.request.getStatus() === parseInt(params[\'http_status_code\'])) {\r\n			return response;\r\n		} else {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Unexpected HTTP response code: \' + this.request.getStatus());\r\n			throw \'Unexpected HTTP response code: \' + this.request.getStatus();\r\n		}\r\n	};\r\n\r\n	this.extractData = function (httpMethod, data, keys, compartment) {\r\n		try {\r\n			data = JSON.parse(data);\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not parse the received JSON object: \' + data);\r\n			throw \'Could not parse received JSON object. See logs for more information.\';\r\n		}\r\n\r\n		if (typeof keys == \'object\') {\r\n			var returnBuffer = [];\r\n			for (var dataObj = 0, dataLength = data.length; dataObj < dataLength; dataObj++) {\r\n\r\n				var objectBuffer = {};\r\n				for (var key = 0, keysLength = keys.length; key < keysLength; key++) {\r\n					if (data[dataObj][keys[key]] || data[dataObj][keys[key]] == null) {\r\n						objectBuffer[keys[key].match(/^[a-z]+$|[A-Z][a-z]+$/)[0].toLowerCase()] = data[dataObj][keys[key]];\r\n					} else {\r\n						Zabbix.log(3, this.zabbixLogPrefix + \' Received an unexpected JSON object. Could not get value for key "\' + keys[key] + \'" in JSON: \' + JSON.stringify(data[dataObj]));\r\n						throw \'Received an unexpected JSON object. See logs for more information.\';\r\n					}\r\n				}\r\n				if (typeof compartment != \'undefined\' && compartment != \'\') objectBuffer[\'compartment\'] = compartment;\r\n				returnBuffer.push(objectBuffer);\r\n			}\r\n			return returnBuffer;\r\n		}\r\n\r\n		try {\r\n			if (httpMethod === \'get\') {\r\n				return data[keys];\r\n			} else {\r\n				if (data.length === 0) {\r\n					return 0;\r\n				}\r\n				data = data[0][keys];\r\n				return data[data.length - 1][\'value\'];\r\n			}\r\n		} catch (error) {\r\n			Zabbix.log(3, this.zabbixLogPrefix + \' Could not find key "\' + keys + \'" in JSON: \' + JSON.stringify(data));\r\n			throw \'Could not find required key in JSON object. See logs for more information.\';\r\n		}\r\n	};\r\n}\r\n\r\nfunction buildMql(id, metrics, defaultStatistic, resourceType) {\r\n	resourceType = resourceType === \'\' || resourceType === undefined ? \'resourceId\' : resourceType;\r\n	this.query = \'[\' + params[\'req_interval\'] + \'m]{\' + resourceType + \'=\' + id + \'}.\';\r\n\r\n	for (var i = 0, metricsLength = metrics.length; i < metricsLength; i++) {\r\n		const metric = ((Array.isArray(metrics[i]) ? metrics[i] : [metrics[i], defaultStatistic]));\r\n		metrics[i] = [metric[0], this.query + metric[1]];\r\n	}\r\n}\r\n\r\n\r\nconst params = JSON.parse(value);\r\nvalidateZabbixParams([\'tenancy_ocid\', \'user_ocid\', \'private_key\', \'fingerprint\', \'api_host\', \'vnic_id\', \'http_status_code\', \'req_interval\', \'compartment_id\'], params);\r\nvar oci = new OCI(\'Compute - VNIC\', \'Get metrics\', params);\r\n\r\nconst metrics = [\r\n	\'VnicEgressDropsSecurityList\',\r\n	\'VnicIngressDropsSecurityList\',\r\n	\'VnicFromNetworkBytes\',\r\n	\'VnicFromNetworkPackets\',\r\n	\'VnicToNetworkBytes\',\r\n	\'VnicToNetworkPackets\',\r\n	\'VnicIngressDropsThrottle\',\r\n	\'VnicEgressDropsThrottle\',\r\n	\'VnicIngressDropsConntrackFull\',\r\n	\'VnicEgressDropsConntrackFull\',\r\n	\'VnicConntrackUtilPercent\',\r\n	[\'VnicConntrackIsFull\', \'last\'],\r\n	\'SmartnicBufferDropsFromNetwork\',\r\n	\'SmartnicBufferDropsFromHost\'\r\n];\r\nbuildMql(params[\'vnic_id\'], metrics, \'sum\');\r\n\r\nvar result = {};\r\nfor (var i = 0, metricsLength = metrics.length; i < metricsLength; i++) {\r\n	result[metrics[i][0]] = oci.extractData(\'post\', oci.executeRequest(\'post\', \'/20180401/metrics/actions/summarizeMetricsData\', \'?compartmentId=\' + encodeURIComponent(params[\'compartment_id\']), metrics[i][0] + metrics[i][1] + \'()\', \'oci_vcn\'), \'aggregatedDatapoints\');\r\n}\r\nreturn JSON.stringify(result);','','0','','','','','2',NULL,'Gets virtual network interface card metrics.','0','7d','0','',NULL,'30s','','','','200','1','0','','','0','0','0','0','0','0','0','eb79782153524452ba4ba8506fb207a5','0','2','0'),
('61547','16','','10370','Tables','jmx.discovery[beans,"org.apache.cassandra.metrics:type=Table,keyspace=*,scope=*,name=ReadLatency"]','1h','31d','365d','0','4','','','','',NULL,NULL,'','','0','{$CASSANDRA.USER}','{$CASSANDRA.PASSWORD}','','','1',NULL,'Info about keyspaces and tables','0','7d','1','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','504e40d04a024249bfd4ac67891f8a21','0','2','0'),
('61548','16','','10370','{#JMXKEYSPACE}.{#JMXSCOPE}: Bloom filter false ratio','jmx["org.apache.cassandra.metrics:type=Table,keyspace={#JMXKEYSPACE},scope={#JMXSCOPE},name=BloomFilterFalseRatio","Value"]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$CASSANDRA.USER}','{$CASSANDRA.PASSWORD}','','','2',NULL,'The ratio of Bloom filter false positives to total checks.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','22c24ee8cfd34623b137c6cad5a2299d','0','2','0'),
('61549','16','','10370','{#JMXKEYSPACE}.{#JMXSCOPE}: Bytes flushed','jmx["org.apache.cassandra.metrics:type=Table,keyspace={#JMXKEYSPACE},scope={#JMXSCOPE},name=BytesFlushed","Count"]','1m','31d','365d','0','3','','B','','',NULL,NULL,'','','0','{$CASSANDRA.USER}','{$CASSANDRA.PASSWORD}','','','2',NULL,'The amount of data that was flushed since (re)start.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','417a27c1779a4d08b5673320b1542ad8','0','2','0'),
('61550','16','','10370','{#JMXKEYSPACE}.{#JMXSCOPE}: Col update time delta75 percentile','jmx["org.apache.cassandra.metrics:type=Table,keyspace={#JMXKEYSPACE},scope={#JMXSCOPE},name=ColUpdateTimeDeltaHistogram","75thPercentile"]','1m','31d','365d','0','0','','ms','','',NULL,NULL,'','','0','{$CASSANDRA.USER}','{$CASSANDRA.PASSWORD}','','','2',NULL,'The column update time delta - p75.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b6623ca2ba0c4dd9ad2be5fa263896f5','0','2','0'),
('61551','16','','10370','{#JMXKEYSPACE}.{#JMXSCOPE}: Col update time delta 95 percentile','jmx["org.apache.cassandra.metrics:type=Table,keyspace={#JMXKEYSPACE},scope={#JMXSCOPE},name=ColUpdateTimeDeltaHistogram","95thPercentile"]','1m','31d','365d','0','0','','ms','','',NULL,NULL,'','','0','{$CASSANDRA.USER}','{$CASSANDRA.PASSWORD}','','','2',NULL,'The column update time delta - p95.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','685e1bbe10044d9d9ae2b02357ba2934','0','2','0'),
('61552','16','','10370','{#JMXKEYSPACE}.{#JMXSCOPE}: Compaction bytes written','jmx["org.apache.cassandra.metrics:type=Table,keyspace={#JMXKEYSPACE},scope={#JMXSCOPE},name=CompactionBytesWritten","Count"]','1m','31d','365d','0','0','','B','','',NULL,NULL,'','','0','{$CASSANDRA.USER}','{$CASSANDRA.PASSWORD}','','','2',NULL,'The amount of data that was compacted since (re)start.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','71b3b14f8ce7414786fa0bcd471e8842','0','2','0'),
('61553','16','','10370','{#JMXKEYSPACE}.{#JMXSCOPE}: Compression ratio','jmx["org.apache.cassandra.metrics:type=Table,keyspace={#JMXKEYSPACE},scope={#JMXSCOPE},name=CompressionRatio","Value"]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$CASSANDRA.USER}','{$CASSANDRA.PASSWORD}','','','2',NULL,'The compression ratio for all SSTables.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','9721c8cd9d0f415d9d5ddfeb417cee01','0','2','0'),
('61554','16','','10370','{#JMXKEYSPACE}.{#JMXSCOPE}: KeyCache hit rate','jmx["org.apache.cassandra.metrics:type=Table,keyspace={#JMXKEYSPACE},scope={#JMXSCOPE},name=KeyCacheHitRate","Value"]','1m','31d','365d','0','0','','','','',NULL,NULL,'','','0','{$CASSANDRA.USER}','{$CASSANDRA.PASSWORD}','','','2',NULL,'The key cache hit rate.','0','7d','0','service:jmx:rmi:///jndi/rmi://{HOST.CONN}:{HOST.PORT}/jmxrmi',NULL,'','','','','200','1','0','','','0','0','0','0','0','0','0','b43134f2d2a043f2a61919467619efe2','0','2','0'),
