mirror of
https://github.com/Dannecron/netology-devops.git
synced 2025-12-25 15:22:37 +03:00
homework 10.1: complete task 2
This commit is contained in:
@@ -73,3 +73,46 @@ vector используется в качестве принимающей то
|
||||
```
|
||||
|
||||
В данном случае считаем ответы `3xx` успешно обработанными.
|
||||
|
||||
### Задание 2
|
||||
|
||||
> Дополнительное задание
|
||||
>
|
||||
> Вы устроились на работу в стартап. На данный момент у вас нет возможности развернуть полноценную систему
|
||||
> мониторинга, и вы решили самостоятельно написать простой python3-скрипт для сбора основных метрик сервера. Вы, как
|
||||
> опытный системный-администратор, знаете, что системная информация сервера лежит в директории `/proc`.
|
||||
> Также, вы знаете, что в системе Linux есть планировщик задач cron, который может запускать задачи по расписанию.
|
||||
>
|
||||
> Суммировав все, вы спроектировали приложение, которое:
|
||||
> - является python3 скриптом
|
||||
> - собирает метрики из папки `/proc`
|
||||
> - складывает метрики в файл 'YY-MM-DD-awesome-monitoring.log' в директорию /var/log (YY - год, MM - месяц, DD - день)
|
||||
> - каждый сбор метрик складывается в виде json-строки, в виде:
|
||||
>
|
||||
> ```text
|
||||
> + timestamp (временная метка, int, unixtimestamp)
|
||||
> + metric_1 (метрика 1)
|
||||
> + metric_2 (метрика 2)
|
||||
>
|
||||
> ...
|
||||
>
|
||||
> + metric_N (метрика N)
|
||||
> ```
|
||||
>
|
||||
> - сбор метрик происходит каждую 1 минуту по cron-расписанию.
|
||||
> - количество собираемых метрик должно быть не менее 4-х.
|
||||
>
|
||||
> Для успешного выполнения задания нужно привести:
|
||||
> 1. работающий код python3-скрипта
|
||||
> 2. конфигурацию cron-расписания
|
||||
> 3. пример верно сформированного 'YY-MM-DD-awesome-monitoring.log', имеющий не менее 5 записей
|
||||
|
||||
Пример python-скрипта, который снимает некоторые метрики из файлов директории `/proc`: [monitor.py](./task2/monitor.py).
|
||||
|
||||
Конфигурация cron-расписания:
|
||||
|
||||
```text
|
||||
* * * * * monitor.py
|
||||
```
|
||||
|
||||
Пример формируемого файла: [22-09-23-awesome-monitoring.log](./task2/22-09-23-awesome-monitoring.log).
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
1663900502
|
||||
{"user": 66838, "nice": 225, "system": 43640, "idle": 324452977, "iowait": 6463, "irc": 0, "softrq": 3824, "steal": 0, "guest": 0}
|
||||
{"MemTotal": "16327972 kB", "MemFree": "13753120 kB", "MemAvailable": "14594012 kB", "Buffers": "102928 kB", "Cached": "927352 kB", "SwapCached": "0 kB", "Active": "579604 kB", "Inactive": "1528844 kB", "Active(anon)": "352 kB", "Inactive(anon)": "1078232 kB", "Active(file)": "579252 kB", "Inactive(file)": "450612 kB", "Unevictable": "0 kB", "Mlocked": "0 kB", "SwapTotal": "4194304 kB", "SwapFree": "4194304 kB", "Dirty": "48 kB", "Writeback": "0 kB", "AnonPages": "1057940 kB", "Mapped": "191540 kB", "Shmem": "400 kB", "KReclaimable": "119928 kB", "Slab": "180108 kB", "SReclaimable": "119928 kB", "SUnreclaim": "60180 kB", "KernelStack": "6736 kB", "PageTables": "26828 kB", "NFS_Unstable": "0 kB", "Bounce": "0 kB", "WritebackTmp": "0 kB", "CommitLimit": "12358288 kB", "Committed_AS": "1905012 kB", "VmallocTotal": "34359738367 kB", "VmallocUsed": "28432 kB", "VmallocChunk": "0 kB", "Percpu": "5504 kB", "AnonHugePages": "325632 kB", "ShmemHugePages": "0 kB", "ShmemPmdMapped": "0 kB", "FileHugePages": "0 kB", "FilePmdMapped": "0 kB", "HugePages_Total": "0", "HugePages_Free": "0", "HugePages_Rsvd": "0", "HugePages_Surp": "0", "Hugepagesize": "2048 kB", "Hugetlb": "0 kB", "DirectMap4k": "62464 kB", "DirectMap2M": "6172672 kB", "DirectMap1G": "19922944 kB"}
|
||||
{"uptime": "202877.14", "idleTime": "3244529.77"}
|
||||
{"rxbytes": 128998069, "rxpackets": 102688, "rxerrs": 0, "rxdrop": 0, "rxfifo": 0, "rxframe": 0, "rxcompressed": 0, "rxmulticast": 53553, "txbytes": 3080275, "txpackets": 24648, "txerrs": 0, "txdrop": 0, "txfifo": 0, "txcolls": 0, "txcarrier": 0, "txcompressed": 0}
|
||||
1663900600
|
||||
{"user": 66983, "nice": 225, "system": 44035, "idle": 324610103, "iowait": 6472, "irc": 0, "softrq": 3881, "steal": 0, "guest": 0}
|
||||
{"MemTotal": "16327972 kB", "MemFree": "13747812 kB", "MemAvailable": "14588880 kB", "Buffers": "103088 kB", "Cached": "927348 kB", "SwapCached": "0 kB", "Active": "579760 kB", "Inactive": "1530216 kB", "Active(anon)": "352 kB", "Inactive(anon)": "1079588 kB", "Active(file)": "579408 kB", "Inactive(file)": "450628 kB", "Unevictable": "0 kB", "Mlocked": "0 kB", "SwapTotal": "4194304 kB", "SwapFree": "4194304 kB", "Dirty": "24 kB", "Writeback": "0 kB", "AnonPages": "1058988 kB", "Mapped": "191540 kB", "Shmem": "400 kB", "KReclaimable": "119932 kB", "Slab": "180272 kB", "SReclaimable": "119932 kB", "SUnreclaim": "60340 kB", "KernelStack": "6816 kB", "PageTables": "26884 kB", "NFS_Unstable": "0 kB", "Bounce": "0 kB", "WritebackTmp": "0 kB", "CommitLimit": "12358288 kB", "Committed_AS": "1905348 kB", "VmallocTotal": "34359738367 kB", "VmallocUsed": "28416 kB", "VmallocChunk": "0 kB", "Percpu": "5504 kB", "AnonHugePages": "331776 kB", "ShmemHugePages": "0 kB", "ShmemPmdMapped": "0 kB", "FileHugePages": "0 kB", "FilePmdMapped": "0 kB", "HugePages_Total": "0", "HugePages_Free": "0", "HugePages_Rsvd": "0", "HugePages_Surp": "0", "Hugepagesize": "2048 kB", "Hugetlb": "0 kB", "DirectMap4k": "62464 kB", "DirectMap2M": "6172672 kB", "DirectMap1G": "19922944 kB"}
|
||||
{"uptime": "202975.84", "idleTime": "3246101.03"}
|
||||
{"rxbytes": 129008477, "rxpackets": 102723, "rxerrs": 0, "rxdrop": 0, "rxfifo": 0, "rxframe": 0, "rxcompressed": 0, "rxmulticast": 53576, "txbytes": 3083235, "txpackets": 24661, "txerrs": 0, "txdrop": 0, "txfifo": 0, "txcolls": 0, "txcarrier": 0, "txcompressed": 0}
|
||||
1663900635
|
||||
{"user": 66999, "nice": 225, "system": 44071, "idle": 324665526, "iowait": 6474, "irc": 0, "softrq": 3883, "steal": 0, "guest": 0}
|
||||
{"MemTotal": "16327972 kB", "MemFree": "13749240 kB", "MemAvailable": "14590360 kB", "Buffers": "103136 kB", "Cached": "927356 kB", "SwapCached": "0 kB", "Active": "579816 kB", "Inactive": "1529596 kB", "Active(anon)": "360 kB", "Inactive(anon)": "1078968 kB", "Active(file)": "579456 kB", "Inactive(file)": "450628 kB", "Unevictable": "0 kB", "Mlocked": "0 kB", "SwapTotal": "4194304 kB", "SwapFree": "4194304 kB", "Dirty": "0 kB", "Writeback": "0 kB", "AnonPages": "1058904 kB", "Mapped": "191636 kB", "Shmem": "400 kB", "KReclaimable": "119940 kB", "Slab": "180568 kB", "SReclaimable": "119940 kB", "SUnreclaim": "60628 kB", "KernelStack": "6784 kB", "PageTables": "26840 kB", "NFS_Unstable": "0 kB", "Bounce": "0 kB", "WritebackTmp": "0 kB", "CommitLimit": "12358288 kB", "Committed_AS": "1905264 kB", "VmallocTotal": "34359738367 kB", "VmallocUsed": "28384 kB", "VmallocChunk": "0 kB", "Percpu": "5504 kB", "AnonHugePages": "333824 kB", "ShmemHugePages": "0 kB", "ShmemPmdMapped": "0 kB", "FileHugePages": "0 kB", "FilePmdMapped": "0 kB", "HugePages_Total": "0", "HugePages_Free": "0", "HugePages_Rsvd": "0", "HugePages_Surp": "0", "Hugepagesize": "2048 kB", "Hugetlb": "0 kB", "DirectMap4k": "62464 kB", "DirectMap2M": "6172672 kB", "DirectMap1G": "19922944 kB"}
|
||||
{"uptime": "203010.52", "idleTime": "3246655.26"}
|
||||
{"rxbytes": 129009723, "rxpackets": 102730, "rxerrs": 0, "rxdrop": 0, "rxfifo": 0, "rxframe": 0, "rxcompressed": 0, "rxmulticast": 53583, "txbytes": 3083235, "txpackets": 24661, "txerrs": 0, "txdrop": 0, "txfifo": 0, "txcolls": 0, "txcarrier": 0, "txcompressed": 0}
|
||||
1663900665
|
||||
{"user": 67014, "nice": 225, "system": 44081, "idle": 324713401, "iowait": 6477, "irc": 0, "softrq": 3884, "steal": 0, "guest": 0}
|
||||
{"MemTotal": "16327972 kB", "MemFree": "13750064 kB", "MemAvailable": "14591220 kB", "Buffers": "103184 kB", "Cached": "927344 kB", "SwapCached": "0 kB", "Active": "579840 kB", "Inactive": "1530356 kB", "Active(anon)": "352 kB", "Inactive(anon)": "1079724 kB", "Active(file)": "579488 kB", "Inactive(file)": "450632 kB", "Unevictable": "0 kB", "Mlocked": "0 kB", "SwapTotal": "4194304 kB", "SwapFree": "4194304 kB", "Dirty": "0 kB", "Writeback": "0 kB", "AnonPages": "1059112 kB", "Mapped": "191540 kB", "Shmem": "400 kB", "KReclaimable": "119940 kB", "Slab": "180280 kB", "SReclaimable": "119940 kB", "SUnreclaim": "60340 kB", "KernelStack": "6736 kB", "PageTables": "26852 kB", "NFS_Unstable": "0 kB", "Bounce": "0 kB", "WritebackTmp": "0 kB", "CommitLimit": "12358288 kB", "Committed_AS": "1905012 kB", "VmallocTotal": "34359738367 kB", "VmallocUsed": "28416 kB", "VmallocChunk": "0 kB", "Percpu": "5504 kB", "AnonHugePages": "331776 kB", "ShmemHugePages": "0 kB", "ShmemPmdMapped": "0 kB", "FileHugePages": "0 kB", "FilePmdMapped": "0 kB", "HugePages_Total": "0", "HugePages_Free": "0", "HugePages_Rsvd": "0", "HugePages_Surp": "0", "Hugepagesize": "2048 kB", "Hugetlb": "0 kB", "DirectMap4k": "62464 kB", "DirectMap2M": "6172672 kB", "DirectMap1G": "19922944 kB"}
|
||||
{"uptime": "203040.46", "idleTime": "3247134.02"}
|
||||
{"rxbytes": 129011635, "rxpackets": 102740, "rxerrs": 0, "rxdrop": 0, "rxfifo": 0, "rxframe": 0, "rxcompressed": 0, "rxmulticast": 53593, "txbytes": 3083235, "txpackets": 24661, "txerrs": 0, "txdrop": 0, "txfifo": 0, "txcolls": 0, "txcarrier": 0, "txcompressed": 0}
|
||||
1663900690
|
||||
{"user": 67027, "nice": 225, "system": 44108, "idle": 324752549, "iowait": 6478, "irc": 0, "softrq": 3884, "steal": 0, "guest": 0}
|
||||
{"MemTotal": "16327972 kB", "MemFree": "13748744 kB", "MemAvailable": "14589900 kB", "Buffers": "103224 kB", "Cached": "927304 kB", "SwapCached": "0 kB", "Active": "579840 kB", "Inactive": "1530520 kB", "Active(anon)": "352 kB", "Inactive(anon)": "1079888 kB", "Active(file)": "579488 kB", "Inactive(file)": "450632 kB", "Unevictable": "0 kB", "Mlocked": "0 kB", "SwapTotal": "4194304 kB", "SwapFree": "4194304 kB", "Dirty": "0 kB", "Writeback": "0 kB", "AnonPages": "1059276 kB", "Mapped": "191864 kB", "Shmem": "400 kB", "KReclaimable": "119940 kB", "Slab": "180704 kB", "SReclaimable": "119940 kB", "SUnreclaim": "60764 kB", "KernelStack": "6736 kB", "PageTables": "26852 kB", "NFS_Unstable": "0 kB", "Bounce": "0 kB", "WritebackTmp": "0 kB", "CommitLimit": "12358288 kB", "Committed_AS": "1905264 kB", "VmallocTotal": "34359738367 kB", "VmallocUsed": "28384 kB", "VmallocChunk": "0 kB", "Percpu": "5504 kB", "AnonHugePages": "331776 kB", "ShmemHugePages": "0 kB", "ShmemPmdMapped": "0 kB", "FileHugePages": "0 kB", "FilePmdMapped": "0 kB", "HugePages_Total": "0", "HugePages_Free": "0", "HugePages_Rsvd": "0", "HugePages_Surp": "0", "Hugepagesize": "2048 kB", "Hugetlb": "0 kB", "DirectMap4k": "62464 kB", "DirectMap2M": "6172672 kB", "DirectMap1G": "19922944 kB"}
|
||||
{"uptime": "203064.96", "idleTime": "3247525.50"}
|
||||
{"rxbytes": 129012525, "rxpackets": 102745, "rxerrs": 0, "rxdrop": 0, "rxfifo": 0, "rxframe": 0, "rxcompressed": 0, "rxmulticast": 53598, "txbytes": 3083235, "txpackets": 24661, "txerrs": 0, "txdrop": 0, "txfifo": 0, "txcolls": 0, "txcarrier": 0, "txcompressed": 0}
|
||||
81
src/homework/10-monitoring/10.1/task2/monitor.py
Normal file
81
src/homework/10-monitoring/10.1/task2/monitor.py
Normal file
@@ -0,0 +1,81 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import datetime
|
||||
import json
|
||||
import re
|
||||
import os
|
||||
|
||||
now = datetime.datetime.now()
|
||||
currentDate = now.strftime("%y-%m-%d")
|
||||
|
||||
cpuMetric = dict({})
|
||||
with open('/proc/stat', 'r') as procfile:
|
||||
cputimes = procfile.readline()
|
||||
# /proc/stat: user, nice, system, idle, iowait, irc, softirq, steal, guest
|
||||
stat = cputimes.split(' ')[2:]
|
||||
cpuMetric['user'] = int(stat[0])
|
||||
cpuMetric['nice'] = int(stat[1])
|
||||
cpuMetric['system'] = int(stat[2])
|
||||
cpuMetric['idle'] = int(stat[3])
|
||||
cpuMetric['iowait'] = int(stat[4])
|
||||
cpuMetric['irc'] = int(stat[5])
|
||||
cpuMetric['softrq'] = int(stat[6])
|
||||
cpuMetric['steal'] = int(stat[7])
|
||||
cpuMetric['guest'] = int(stat[8])
|
||||
|
||||
cpuMetricsJson = json.dumps(cpuMetric)
|
||||
|
||||
memInfoMetric = dict({})
|
||||
with open('/proc/meminfo', 'r') as procfile:
|
||||
memInfoMetric = dict(x.strip().split(None, 1) for x in procfile)
|
||||
memInfoMetric = {key.strip(':'): item.strip() for key, item in memInfoMetric.items()}
|
||||
|
||||
uptimeMetric = dict({})
|
||||
memInfoMetricJson = json.dumps(memInfoMetric)
|
||||
with open('/proc/uptime', 'r') as procfile:
|
||||
uptimeInfo = procfile.readline().split(' ')
|
||||
uptimeMetric = dict({ 'uptime': uptimeInfo[0].strip(), 'idleTime': uptimeInfo[1].strip() })
|
||||
uptimeMetricJson = json.dumps(uptimeMetric)
|
||||
|
||||
eth0Metric = dict({})
|
||||
with open('/proc/net/dev') as fd:
|
||||
lines = list(map(lambda x: x.strip(), fd.readlines()))
|
||||
lines = lines[1:]
|
||||
|
||||
lines[0] = lines[0].replace('|', ':', 1)
|
||||
lines[0] = lines[0].replace('|', ' ', 1)
|
||||
lines[0] = lines[0].split(':')[1]
|
||||
|
||||
keys = re.split('\s+', lines[0])
|
||||
keys = list(map(lambda x: 'rx' + x[1] if x[0] < 8 else 'tx' + x[1], enumerate(keys)))
|
||||
|
||||
ifaces = {}
|
||||
for line in lines[1:]:
|
||||
interface, values = line.split(':')
|
||||
values = re.split('\s+', values)
|
||||
|
||||
if values[0] == '':
|
||||
values = values[1:]
|
||||
|
||||
values = list(map(int, values))
|
||||
|
||||
ifaces[interface] = dict(zip(keys, values))
|
||||
eth0Metric = ifaces['eth0']
|
||||
|
||||
eth0MetricJson = json.dumps(eth0Metric)
|
||||
|
||||
monitorFileName = "{}-awesome-monitoring.log".format(currentDate)
|
||||
monitorFilePath = "/var/log/{}".format(monitorFileName)
|
||||
|
||||
if not os.path.exists(monitorFilePath):
|
||||
os.mknod(monitorFilePath)
|
||||
|
||||
with open(monitorFilePath, 'a') as monitorFile:
|
||||
monitorString = "{}\n{}\n{}\n{}\n{}\n".format(
|
||||
int(now.timestamp()),
|
||||
cpuMetricsJson,
|
||||
memInfoMetricJson,
|
||||
uptimeMetricJson,
|
||||
eth0MetricJson,
|
||||
)
|
||||
monitorFile.write(monitorString)
|
||||
Reference in New Issue
Block a user