Skip to content

Commit 4989c46

Browse files
committed
Add script to record when a node was last seen online
1 parent d0cc343 commit 4989c46

File tree

1 file changed

+79
-0
lines changed

1 file changed

+79
-0
lines changed

jenkins/jenkins-node-last-online.py

+79
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#!/usr/bin/env python3
2+
3+
import argparse
4+
import datetime
5+
import json
6+
import os.path
7+
import sys
8+
import time
9+
import urllib
10+
from hashlib import sha1
11+
12+
sys.path.insert(0, os.path.dirname(os.path.dirname(__file__)))
13+
14+
import es_utils
15+
16+
17+
JENKINS_PREFIX = "jenkins"
18+
try:
19+
JENKINS_PREFIX = os.environ["JENKINS_URL"].strip("/").split("/")[-1]
20+
except:
21+
JENKINS_PREFIX = "jenkins"
22+
23+
24+
def sha1hexdigest(data):
25+
return sha1(data.encode()).hexdigest()
26+
27+
28+
def main(dryrun):
29+
req = urllib.request.Request(
30+
"http://localhost:8080/jenkins/manage/computer/api/json?tree=computer[displayName,monitorData[*]]"
31+
)
32+
req.add_header("OIDC_CLAIM_CERN_UPN", "cmsbuild")
33+
with urllib.request.urlopen(req) as response:
34+
data = json.loads(response.read())
35+
36+
for comp in data["computer"]:
37+
responseTime = None
38+
39+
try:
40+
responseTimeMonitor = comp["monitorData"]["hudson.node_monitors.ResponseTimeMonitor"]
41+
if responseTimeMonitor is not None:
42+
responseTime = responseTimeMonitor["timestamp"]
43+
except KeyError:
44+
print("Could not get timestamp for node ", comp.get("displayName", "?"))
45+
46+
if responseTime is None:
47+
continue
48+
49+
document_id = sha1hexdigest(comp["displayName"])
50+
if dryrun:
51+
es_utils.send_payload(
52+
"cmssdt-jenkins-node",
53+
"node",
54+
document_id,
55+
json.dumps(
56+
{
57+
"jenkins_server": JENKINS_PREFIX,
58+
"node_name": comp["displayName"],
59+
"timestamp": responseTime,
60+
}
61+
),
62+
)
63+
64+
65+
if __name__ == "__main__":
66+
parser = argparse.ArgumentParser()
67+
parser.add_argument("-n", "--dry-run", action="store_true", dest="dryrun")
68+
args = parser.parse_args()
69+
70+
# Set start time
71+
start_time = datetime.datetime.now()
72+
while True:
73+
current_time = datetime.datetime.now()
74+
elapsed_time = current_time - start_time
75+
if elapsed_time > datetime.timedelta(hours=2):
76+
break
77+
78+
main(args.dryrun)
79+
time.sleep(2)

0 commit comments

Comments
 (0)