From baa0cb8ca6c7a6e57a285b8ba300537fc269ee4b Mon Sep 17 00:00:00 2001 From: dannc Date: Fri, 23 Sep 2022 09:39:42 +0700 Subject: [PATCH] homework 10.1: complete task 2 --- src/homework/10-monitoring/10.1/readme.md | 43 ++++++++++ .../task2/22-09-23-awesome-monitoring.log | 25 ++++++ .../10-monitoring/10.1/task2/monitor.py | 81 +++++++++++++++++++ 3 files changed, 149 insertions(+) create mode 100644 src/homework/10-monitoring/10.1/task2/22-09-23-awesome-monitoring.log create mode 100644 src/homework/10-monitoring/10.1/task2/monitor.py diff --git a/src/homework/10-monitoring/10.1/readme.md b/src/homework/10-monitoring/10.1/readme.md index f489b2f..72793cc 100644 --- a/src/homework/10-monitoring/10.1/readme.md +++ b/src/homework/10-monitoring/10.1/readme.md @@ -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). diff --git a/src/homework/10-monitoring/10.1/task2/22-09-23-awesome-monitoring.log b/src/homework/10-monitoring/10.1/task2/22-09-23-awesome-monitoring.log new file mode 100644 index 0000000..5bab8d6 --- /dev/null +++ b/src/homework/10-monitoring/10.1/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} diff --git a/src/homework/10-monitoring/10.1/task2/monitor.py b/src/homework/10-monitoring/10.1/task2/monitor.py new file mode 100644 index 0000000..78fe9a0 --- /dev/null +++ b/src/homework/10-monitoring/10.1/task2/monitor.py @@ -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)