На днях столкнулся с необходимостью вывести количество выделенных CPU и RAM по каждой виртуальной машине в Grafana.
По умолчанию, я собираю статистику используя связку telegraf + influxdb и вывожу все это на дашборд Grafana, но когда полез смотреть, может ли telegraf собирать статичные метрики, по типу «выделенных ядер» или «ОЗУ», увидел, что telegraf такое собирать не умеет.
Решение пришло в голову моментально, написать свой кастомный скрипт для сбора метрик и заталкиванием этого добра в одно «ведро» (bucket), куда сейчас складируются остальные метрики VMware собираемые telegraf-ом.
В самом конце ниже приведенного скрипта на python нужно задать переменные для подключения к vCenter и InfluxDB:
vcenter_server = «example-vcsa-server.com» — DNS имя или IP адрес VCSA
vcenter_user = «all-view-only-user@vsphere.local» — Пользователь vSphere с правом доступ на просмотр всего
vcenter_password = «hardpassword123»
influx_url = «http://example-influxdb-server.com:8086» — URL адрес InfluxDB
influx_token = «WriteTokenJiOKmNJFD==» — токен с правом записи в bucket
influx_org = «example-org»
influx_bucket = «example-bucket»
Так же, в скрипт внесены дополнительные настройки, по типу:
- Не собирать статистику по ВМ у которых в названии есть нижний прочерк «_» (сделано это с целью не собирать инфу по виртуалкам, которые создаются во время Veeam SureBackup)
- Собирать статистику только по Включенным ВМ (со статусом poweredOn)
from pyVim.connect import SmartConnect, Disconnect
from pyVmomi import vim
import ssl
from influxdb_client import InfluxDBClient, Point
from influxdb_client.client.write_api import SYNCHRONOUS
# Подключение к vCenter
def connect_to_vcenter(server, user, password):
context = ssl._create_unverified_context()
return SmartConnect(host=server, user=user, pwd=password, sslContext=context)
# Получение данных по виртуальным машинам
def collect_vm_data(content):
vm_data = []
container = content.rootFolder # Начальная точка поиска
view_type = [vim.VirtualMachine]
recursive = True
container_view = content.viewManager.CreateContainerView(container, view_type, recursive)
for vm in container_view.view:
# Пропускаем ВМ, если в имени есть "_"
if "_" in vm.name:
continue
if vm.runtime.powerState == "poweredOn": # Только включённые ВМ
vm_info = {
"name": vm.name,
"cpu_count": vm.config.hardware.numCPU,
"memory_gb": vm.config.hardware.memoryMB,
"disk_size_gb": sum([disk.capacityInKB for disk in vm.config.hardware.device if isinstance(disk, vim.vm.device.VirtualDisk)]) / (1024 ** 2)
}
vm_data.append(vm_info)
container_view.Destroy()
return vm_data
# Запись данных в InfluxDB
def write_to_influxdb(vm_data, influx_url, token, org, bucket):
client = InfluxDBClient(url=influx_url, token=token, org=org)
write_api = client.write_api(write_options=SYNCHRONOUS)
for vm in vm_data:
point = Point("vm_resources") \
.tag("vm_name", vm["name"]) \
.field("cpu_count", vm["cpu_count"]) \
.field("memory_gb", vm["memory_gb"]) \
.field("disk_size_gb", vm["disk_size_gb"])
write_api.write(bucket=bucket, org=org, record=point)
client.close()
# Основной функционал
if __name__ == "__main__":
vcenter_server = "example-vcsa-server.com"
vcenter_user = "all-view-only-user@vsphere.local"
vcenter_password = "hardpassword123"
influx_url = "http://example-influxdb-server.com:8086"
influx_token = "WriteTokenJiOKmNJFD=="
influx_org = "example-org"
influx_bucket = "example-bucket"
try:
si = connect_to_vcenter(vcenter_server, vcenter_user, vcenter_password)
content = si.RetrieveContent()
vm_data = collect_vm_data(content)
write_to_influxdb(vm_data, influx_url, influx_token, influx_org, influx_bucket)
print("Данные успешно отправлены в InfluxDB.")
except Exception as e:
print(f"Ошибка: {e}")
finally:
Disconnect(si)
Добавить комментарий