Рекомендации по работе с данными в скриптах

Данная статья содержит несколько примеров того, каким образом можно выполнить сбор некоторых данных с помощью скриптов в сенсоре.

Например:

  • Собрать несколько значений в одной строку.
  • Посчитать сумму значений

Для этого нужно найти поля по регулярному выражению и определить, что делать со значениями найденных полей.

Предположим, при работе сенсора были собраны данные конфигурации сетевых адаптеров (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
        }
    },
....

Необходимо указать, из каких полей собирать данные.
То есть вместо указания одного поля:

“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” с регулярным выражением требует ЯВНОГО указания имени.

Если найдено несколько полей по регулярным выражениям, то данные с этих полей сохраняются под указанным именем поля (в примере - 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”]

В это случае последний скрипт будет искать в результатах предыдущих объекты с данным именем и объединять данные.