Рекомендации по работе с данными в скриптах
Обзор возможностей
Данная статья содержит несколько примеров того, каким образом можно выполнить сбор некоторых данных с помощью скриптов в сенсоре.
Как найти и выполнить действие с несколькими значениями
Например:
- Собрать несколько значений в одной строку.
 - Посчитать сумму значений
 
Для этого нужно найти поля по регулярному выражению и определить, что делать со значениями найденных полей.
Предположим, при работе сенсора были собраны данные конфигурации сетевых адаптеров (nics). У каждого адаптера (3 шт.) есть MAC-адрес.
Необходимо показать все три адреса в одной строке через запятую.
...
"nics": {
        "4000": {
            "start_connected": true,
            "pci_slot_number": 160,
            "backing": {
                "connection_cookie": 2088443794,
                "distributed_port": "72",
                "distributed_switch_uuid": "50 31 a5 14 03 d6 fd f1-ca 2b a6 85 dd d3 4f fa",
                "type": "DISTRIBUTED_PORTGROUP",
                "network": "dvportgroup-70385" 
            },
            "mac_address": "00:50:56:b1:00:01",
            "mac_type": "ASSIGNED",
            "allow_guest_control": true,
            "wake_on_lan_enabled": true,
            "label": "Network adapter 1",
            "state": "CONNECTED",
            "type": "VMXNET3",
            "upt_compatibility_enabled": true
        },
        "4001": {
            "start_connected": true,
            "pci_slot_number": 192,
            "backing": {
                "connection_cookie": 2088449340,
                "distributed_port": "73",
                "distributed_switch_uuid": "50 31 a5 14 03 d6 fd f1-ca 2b a6 85 dd d3 4f fa",
                "type": "DISTRIBUTED_PORTGROUP",
                "network": "dvportgroup-70385" 
            },
            "mac_address": "00:50:56:b1:8a:1f",
            "mac_type": "ASSIGNED",
            "allow_guest_control": true,
            "wake_on_lan_enabled": true,
            "label": "Network adapter 2",
            "state": "CONNECTED",
            "type": "VMXNET3",
            "upt_compatibility_enabled": true
        },
        "4002": {
            "start_connected": true,
            "pci_slot_number": 224,
            "backing": {
                "connection_cookie": 2088453292,
                "distributed_port": "310",
                "distributed_switch_uuid": "50 31 a5 14 03 d6 fd f1-ca 2b a6 85 dd d3 4f fa",
                "type": "DISTRIBUTED_PORTGROUP",
                "network": "dvportgroup-76457" 
            },
            "mac_address": "00:50:56:b1:ce:5e",
            "mac_type": "ASSIGNED",
            "allow_guest_control": true,
            "wake_on_lan_enabled": true,
            "label": "Network adapter 3",
            "state": "CONNECTED",
            "type": "VMXNET3",
            "upt_compatibility_enabled": true
        }
    },
....Шаг 1. Найти и объединить поля
Необходимо указать, из каких полей собирать данные.
То есть вместо указания одного поля:
“field” : [“OSVersion=guest_OS”, “CsDNSHostName=name”, “identity”,“MacAddress=nics/400/mac_address”]
использовать маску, чтобы взять все значения. Например:
“field” : [“OSVersion=guest_OS”, “CsDNSHostName=name”, “identity”,“MacAddress=nics/**400*/**mac_address”]
“field” : [“OSVersion=guest_OS”, “CsDNSHostName=name”, “identity”,“MacAddress=nics/400_/mac_address”]
“field” : [“OSVersion=guest_OS”, “CsDNSHostName=name”, “identity”,“MacAddress=nics/400[a-z]_[0-9][0-9]*/mac_address”]
Важно: “field” с регулярным выражением требует ЯВНОГО указания имени.
Шаг 2. Указать, что делать со всеми найденными значениями
Если найдено несколько полей по регулярным выражениям, то данные с этих полей сохраняются под указанным именем поля (в примере - MacAddress) через запятую, или по заданному fieldAggregationType.
Допустимые fieldAggregationType:
- "sum"
 - "max"
 - "min"
 - "first"
 - "last"
 - "StringTrim"
 
То есть, так как по умолчанию значения перечисляются через запятую, то для примера выше ничего больше указывать не нужно.
Другой пример:
“field” : [“OSVersion=guest_OS”, “CsDNSHostName=name”, “identity”,“DisksCapacity=disks/[a-z]_[0-9][0-9]*/capacity”]“fieldAggregationType”: {“DisksCapacity”:“sum”, “CsDNSHostName”:“StringTrim”}
Как объединить данные разных скриптов
Вы можете объединить данные, собранные в одном сенсоре разными скриптами. 
Поддерживается всеми скриптами с типом внутренний скрипт.
Например, в одном сенсоре есть цепочка из двух скриптов. После выполнения они получили данные:
- Скрипт 1: имя, версия, производитель.
 - Скрипт 2: имя, MAC-адрес, IP-адрес.
 
Если имя одинаковое, то эти значения можно объединить.
Для этого укажите в identityFields последнего скрипта (в нашем случае втором), по какому полю/полям будем идентифицировать и объединять:
“field” : [“OSVersion=guest_OS”, “CsDNSHostName=name”, “identity”,“DisksCapacity=disks/[a-z]_[0-9][0-9]*/capacity”]
“fieldAggregationType”: {“DisksCapacity”:“sum”, “CsDNSHostName”:“StringTrim”}
“identityFields”: [“CsDNSHostName”, “identity”]
В это случае последний скрипт будет искать в результатах предыдущих объекты с данным именем и объединять данные.