mihai.leontescu / metrics (public) (License: GPLv3) (since 2018-07-12) (hash sha1)
Metrics for Linux to feed to Graphite in python
Disclaimer: I am not a programmer, I know some things can be done better. I choose to do them so, so I am able to understand them 80 years later :)
List of commits:
Subject Hash Author Date (UTC)
initial commit pre-alpha d4f64fe23a814b563d1df7fea142daae8aaa0a75 mihai.leontescu 2018-07-12 19:29:49
Commit d4f64fe23a814b563d1df7fea142daae8aaa0a75 - initial commit pre-alpha
Author: mihai.leontescu
Author date (UTC): 2018-07-12 19:29
Committer name: mihai.leontescu
Committer date (UTC): 2018-07-12 19:29
Parent(s):
Signing key:
Tree: bd334180d319b064b01d8ffa560a714a1262da52
File Lines added Lines deleted
conf/metrics.conf 6 0
logs/metrics.log 189299 0
metrics-nosend.py 62 0
metrics.d/LinuxCPU.py 30 0
metrics.d/LinuxDisk.py 19 0
metrics.d/LinuxNetwork.py 21 0
metrics.d/__pycache__/LinuxCPU.cpython-33.pyc 0 0
metrics.d/__pycache__/LinuxDisk.cpython-33.pyc 0 0
metrics.d/__pycache__/LinuxNetwork.cpython-33.pyc 0 0
metrics.d/__pycache__/LinuxSystem.cpython-33.pyc 0 0
metrics.d/test.py 7 0
metrics.py 61 0
File conf/metrics.conf added (mode: 100644) (index 0000000..716d8e6)
1 {
2 "LogFile": "/opt/metrics/logs/metrics.log",
3 "GraphHost" : "10.49.91.5",
4 "GraphPort" : 2003
5
6 }
The diff for file logs/metrics.log is too big (189299 changes) and cannot be shown.
File metrics-nosend.py added (mode: 100755) (index 0000000..0033fae)
1 #!/usr/bin/python3
2
3
4 import time
5 import os
6 import socket
7 import json
8 import importlib
9 import sys
10
11 Path=sys.path[0]
12 ConfigFileLocation=Path+"/conf/metrics.conf"
13 MetricsLocation=Path+"/metrics.d"
14
15 sys.path.append(MetricsLocation)
16
17 ## Read from Configfile
18 with open(ConfigFileLocation,'r') as ConfigFile:
19 Configuration = json.load(ConfigFile)
20
21 GraphHost=Configuration["GraphHost"]
22 GraphPort=Configuration["GraphPort"]
23 LogFile=Configuration["LogFile"]
24
25 ### / End Read Configfile
26
27 def WriteLog(message):
28 Log = open(LogFile,'a')
29 message=str(time.asctime())+' '+message
30 Log.write(message)
31 Log.close()
32
33 def graphSend(content):
34 s = socket.socket()
35 s.connect((GraphHost, GraphPort))
36 s.sendall(content.encode())
37 s.close()
38
39 try:
40 import LinuxNetwork
41 import LinuxDisk
42 import LinuxCPU
43 except:
44 print ("SNAFU")
45 sys.exit(2)
46
47
48
49 while True:
50 toSend=""
51 toSend+=LinuxNetwork.network()
52 toSend+=LinuxDisk.disk()
53 toSend+=LinuxCPU.cpu()
54 WriteLog ("START: Sending metrics --> ")
55 try:
56 #graphSend(toSend)
57 print(toSend)
58 WriteLog (" OK\n")
59 except Exception as err:
60 WriteLog (" ERROR: %s\n" % (err))
61 pass
62 time.sleep(9)
File metrics.d/LinuxCPU.py added (mode: 100644) (index 0000000..9babdb0)
1 #!/usr/bin/python3
2
3 import time
4 import socket
5 import sys
6 import os
7
8 def cpu():
9 file = open("/proc/stat","r")
10 lines = file.readlines()
11
12 now = int(time.time())
13 met = ""
14 for cpu in lines:
15 values=cpu.split()
16 if ('cpu' in values[0]):
17 met=met+"%s.%s.system.%s.user.ticks %s %s\n" % (sys.platform,os.uname()[1],values[0],values[1],now)
18 met=met+"%s.%s.system.%s.nice.ticks %s %s\n" % (sys.platform,os.uname()[1],values[0],values[2],now)
19 met=met+"%s.%s.system.%s.system.ticks %s %s\n" % (sys.platform,os.uname()[1],values[0],values[3],now)
20 met=met+"%s.%s.system.%s.idle.ticks %s %s\n" % (sys.platform,os.uname()[1],values[0],values[4],now)
21 met=met+"%s.%s.system.%s.iowait.ticks %s %s\n" % (sys.platform,os.uname()[1],values[0],values[5],now)
22 met=met+"%s.%s.system.%s.irq.ticks %s %s\n" % (sys.platform,os.uname()[1],values[0],values[6],now)
23
24 if (values[0] in 'ctxt'):
25 met=met+"%s.%s.system.%s.contextswitches %s %s\n" % (sys.platform,os.uname()[1],values[0],values[1],now)
26
27 if (values[0] in 'processes'):
28 met=met+"%s.%s.system.%s.processes %s %s\n" % (sys.platform,os.uname()[1],values[0],values[1],now)
29
30 return met
File metrics.d/LinuxDisk.py added (mode: 100644) (index 0000000..6c85d68)
1 #!/usr/bin/python3
2
3 import time
4 import socket
5 import sys
6 import os
7
8 def disk():
9 file = open("/proc/diskstats","r")
10 lines = file.readlines()
11
12 now = int(time.time())
13 met = ""
14 for disk in lines:
15 values=disk.split()
16 if (int(values[0]) == 8):
17 met=met+"%s.%s.system.disk.%s.read.sectors %s %s\n" % (sys.platform,os.uname()[1],values[2],values[5],now)
18 met=met+"%s.%s.system.disk.%s.write.sectors %s %s\n" % (sys.platform,os.uname()[1],values[2],values[9],now)
19 return met
File metrics.d/LinuxNetwork.py added (mode: 100644) (index 0000000..28e97a8)
1 #!/usr/bin/python3
2
3 import time
4 import socket
5 import sys
6 import os
7
8 def network():
9 file = open("/proc/net/dev","r")
10 lines = file.readlines()
11 #first two lines are just headers
12 del lines[:2]
13 met=""
14 now = int(time.time())
15 for interface in lines:
16 values=interface.split()
17 met=met+"%s.%s.network.%s.rx.bytes %s %s\n" % (sys.platform,os.uname()[1],values[0].replace(":",""),values[1],now)
18 met=met+"%s.%s.network.%s.rx.packets %s %s\n" % (sys.platform,os.uname()[1],values[0].replace(":",""),values[2],now)
19 met=met+"%s.%s.network.%s.tx.bytes %s %s\n" % (sys.platform,os.uname()[1],values[0].replace(":",""),values[9],now)
20 met=met+"%s.%s.network.%s.tx.packets %s %s\n" % (sys.platform,os.uname()[1],values[0].replace(":",""),values[10],now)
21 return met
File metrics.d/__pycache__/LinuxCPU.cpython-33.pyc added (mode: 100644) (index 0000000..e3e4b3e)
File metrics.d/__pycache__/LinuxDisk.cpython-33.pyc added (mode: 100644) (index 0000000..2aefbaa)
File metrics.d/__pycache__/LinuxNetwork.cpython-33.pyc added (mode: 100644) (index 0000000..d08434d)
File metrics.d/__pycache__/LinuxSystem.cpython-33.pyc added (mode: 100644) (index 0000000..e88d8ab)
File metrics.d/test.py added (mode: 100755) (index 0000000..ae17fb5)
1 #!/usr/bin/python3
2
3 import sys
4 import os
5
6 print (sys.platform)
7 print (os.uname()[1])
File metrics.py added (mode: 100755) (index 0000000..f0d7659)
1 #!/usr/bin/python3
2
3
4 import time
5 import os
6 import socket
7 import json
8 import importlib
9 import sys
10
11 Path=sys.path[0]
12 ConfigFileLocation=Path+"/conf/metrics.conf"
13 MetricsLocation=Path+"/metrics.d"
14
15 sys.path.append(MetricsLocation)
16
17 ## Read from Configfile
18 with open(ConfigFileLocation,'r') as ConfigFile:
19 Configuration = json.load(ConfigFile)
20
21 GraphHost=Configuration["GraphHost"]
22 GraphPort=Configuration["GraphPort"]
23 LogFile=Configuration["LogFile"]
24
25 ### / End Read Configfile
26
27 def WriteLog(message):
28 Log = open(LogFile,'a')
29 message=str(time.asctime())+' '+message
30 Log.write(message)
31 Log.close()
32
33 def graphSend(content):
34 s = socket.socket()
35 s.connect((GraphHost, GraphPort))
36 s.sendall(content.encode())
37 s.close()
38
39 try:
40 import LinuxNetwork
41 import LinuxDisk
42 import LinuxCPU
43 except:
44 print ("SNAFU")
45 sys.exit(2)
46
47
48
49 while True:
50 toSend=""
51 toSend+=LinuxNetwork.network()
52 toSend+=LinuxDisk.disk()
53 toSend+=LinuxCPU.cpu()
54 WriteLog ("START: Sending metrics --> ")
55 try:
56 graphSend(toSend)
57 WriteLog (" OK\n")
58 except Exception as err:
59 WriteLog (" ERROR: %s\n" % (err))
60 pass
61 time.sleep(9)
Hints:
Before first commit, do not forget to setup your git environment:
git config --global user.name "your_name_here"
git config --global user.email "your@email_here"

Clone this repository using HTTP(S):
git clone https://rocketgit.com/user/mihai.leontescu/metrics

Clone this repository using ssh (do not forget to upload a key first):
git clone ssh://rocketgit@ssh.rocketgit.com/user/mihai.leontescu/metrics

Clone this repository using git:
git clone git://git.rocketgit.com/user/mihai.leontescu/metrics

You are allowed to anonymously push to this repository.
This means that your pushed commits will automatically be transformed into a merge request:
... clone the repository ...
... make some changes and some commits ...
git push origin main