Skip to content

Commit e84e00d

Browse files
scripts: add set log level script
1 parent a109ad6 commit e84e00d

File tree

1 file changed

+122
-0
lines changed

1 file changed

+122
-0
lines changed

scripts/set_log_level.py

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import argparse
2+
import subprocess
3+
import sys
4+
from typing import List
5+
6+
import requests
7+
import signal
8+
import socket
9+
10+
11+
def parse_args(args: List[str]) -> argparse.Namespace:
12+
parser = argparse.ArgumentParser(description="Set the log level for a crate")
13+
parser.add_argument(
14+
"--crate_name", type=str, help="The name of the crate to set the log level for"
15+
)
16+
parser.add_argument("--log_level", type=str, help="The log level to set for the crate")
17+
parser.add_argument(
18+
"--pod_name",
19+
type=str,
20+
default="",
21+
help="Optional Kubernetes pod name to port-forward to",
22+
)
23+
24+
parser.add_argument(
25+
"--local_port",
26+
type=int,
27+
default=8082,
28+
help="Local port to bind the port-forward to (defaults to 8082)",
29+
)
30+
31+
parser.add_argument(
32+
"--monitoring_port",
33+
type=int,
34+
default=8082,
35+
help="Monitoring port exposed by the pod (defaults to 8082)",
36+
)
37+
38+
parser.add_argument(
39+
"--method",
40+
type=str,
41+
choices=["get", "post"],
42+
default="post",
43+
help="HTTP method to use: 'get' to read current log level, 'post' to set a log level",
44+
)
45+
return parser.parse_args(args)
46+
47+
48+
def main():
49+
args = parse_args(sys.argv[1:])
50+
51+
# If a pod name is supplied, establish a port-forward before making the request
52+
port_forward_proc = None
53+
54+
target_port = args.monitoring_port
55+
base_port = args.local_port if args.pod_name else target_port
56+
57+
if args.pod_name:
58+
cmd = [
59+
"kubectl",
60+
"port-forward",
61+
args.pod_name,
62+
f"{args.local_port}:{args.monitoring_port}",
63+
]
64+
65+
print("Starting port-forward:", " ".join(cmd))
66+
port_forward_proc = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
67+
68+
try:
69+
with socket.create_connection(("localhost", args.local_port), timeout=1):
70+
print(
71+
f"Port-forward to {args.pod_name}:{args.monitoring_port} is ready on localhost:{args.local_port}"
72+
)
73+
except OSError as e:
74+
print(f"Unexpected error: port-forward appears up but connection failed. Details: {e}")
75+
76+
try:
77+
if args.method == "get":
78+
full_url = f"http://localhost:{base_port}/monitoring/logLevel"
79+
print(f"Fetching current log level from {full_url}")
80+
response = requests.get(full_url, timeout=5)
81+
82+
if response.status_code != 200:
83+
print(f"Failed to fetch log level: {response.status_code} {response.text}")
84+
sys.exit(1)
85+
86+
print("Current log level response:\n", response.text)
87+
elif args.method == "post":
88+
# Validate required arguments
89+
if not args.crate_name or not args.log_level:
90+
print("--crate_name and --log_level are required when --method=post")
91+
sys.exit(1)
92+
93+
base_url = f"http://localhost:{base_port}/monitoring/setLogLevel"
94+
full_url = f"{base_url}/{args.crate_name}/{args.log_level}"
95+
96+
print(f"Setting log level for {args.crate_name} to {args.log_level} at {full_url}")
97+
98+
response = requests.post(full_url, timeout=5)
99+
100+
if response.status_code != 200:
101+
print(
102+
f"Failed to set log level for {args.crate_name} to {args.log_level}: {response.text}"
103+
)
104+
sys.exit(1)
105+
106+
print(f"Successfully set log level for {args.crate_name} to {args.log_level}")
107+
else:
108+
print(f"Unsupported method {args.method}. Use 'get' or 'post'.")
109+
sys.exit(1)
110+
finally:
111+
# Clean up the port-forward process if we started one
112+
if port_forward_proc:
113+
port_forward_proc.send_signal(signal.SIGINT)
114+
try:
115+
port_forward_proc.wait(timeout=5)
116+
except subprocess.TimeoutExpired:
117+
port_forward_proc.kill()
118+
port_forward_proc.wait()
119+
120+
121+
if __name__ == "__main__":
122+
main()

0 commit comments

Comments
 (0)