Skip to content

Commit dedc7ae

Browse files
committed
(Week-1 deliverables) Created 2 files to collect logs,heartbeat and registration from 3 microservices
1 parent 8ffd82d commit dedc7ae

File tree

2 files changed

+120
-0
lines changed

2 files changed

+120
-0
lines changed

node.py

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
# node.py
2+
import uuid
3+
import time
4+
import threading
5+
import random
6+
import json
7+
from datetime import datetime
8+
from colorama import Fore, Style, init
9+
from threading import Lock
10+
11+
# Initialize colorama for colored terminal output
12+
init(autoreset=True)
13+
14+
# Global lock for synchronized printing
15+
print_lock = Lock()
16+
17+
class Node:
18+
# Colors for message types
19+
message_colors = {
20+
"registration": Fore.CYAN,
21+
"heartbeat": Fore.RED,
22+
"Log": Fore.GREEN
23+
}
24+
# Colors for keys and values within messages
25+
key_color = Fore.LIGHTMAGENTA_EX
26+
value_color = Fore.LIGHTYELLOW_EX
27+
28+
def __init__(self, service_name):
29+
self.node_id = str(uuid.uuid4())
30+
self.service_name = service_name
31+
self.status = "UP"
32+
self.register_node()
33+
34+
def format_message(self, message):
35+
"""
36+
Format JSON message to color keys and values distinctly.
37+
"""
38+
formatted_message = ""
39+
for key, value in message.items():
40+
# Apply color for keys and values
41+
formatted_message += f"{Node.key_color}{key}{Style.RESET_ALL}: {Node.value_color}{value}{Style.RESET_ALL}, "
42+
return "{" + formatted_message.rstrip(", ") + "}"
43+
44+
def print_message(self, message_type, message_content):
45+
with print_lock:
46+
color = Node.message_colors[message_type]
47+
formatted_content = self.format_message(json.loads(message_content))
48+
print(color + f"{message_type.capitalize()}:" + Style.RESET_ALL, formatted_content)
49+
50+
def register_node(self):
51+
registration_message = {
52+
"node_id": self.node_id,
53+
"message_type": "REGISTRATION",
54+
"service_name": self.service_name,
55+
"timestamp": datetime.now().isoformat()
56+
}
57+
self.print_message("registration", json.dumps(registration_message))
58+
59+
def generate_log(self, log_level, message, extra_data=None):
60+
log_message = {
61+
"log_id": str(uuid.uuid4()),
62+
"node_id": self.node_id,
63+
"log_level": log_level,
64+
"message_type": "LOG",
65+
"message": message,
66+
"service_name": self.service_name,
67+
"timestamp": datetime.now().isoformat()
68+
}
69+
if extra_data:
70+
log_message.update(extra_data)
71+
self.print_message("Log", json.dumps(log_message))
72+
73+
def send_heartbeat(self):
74+
heartbeat_message = {
75+
"node_id": self.node_id,
76+
"message_type": "HEARTBEAT",
77+
"status": self.status,
78+
"timestamp": datetime.now().isoformat()
79+
}
80+
self.print_message("heartbeat", json.dumps(heartbeat_message))
81+
82+
def start_heartbeat(self, interval=5):
83+
def heartbeat():
84+
while self.status == "UP":
85+
self.send_heartbeat()
86+
time.sleep(interval)
87+
threading.Thread(target=heartbeat).start()
88+
89+
def start_log_generation(self, interval=3):
90+
def generate_logs():
91+
log_levels = ["INFO", "WARN", "ERROR"]
92+
while self.status == "UP":
93+
log_level = random.choice(log_levels)
94+
if log_level == "INFO":
95+
self.generate_log("INFO", "This is an info log.")
96+
elif log_level == "WARN":
97+
self.generate_log("WARN", "This is a warning log.", {
98+
"response_time_ms": random.randint(100, 500),
99+
"threshold_limit_ms": 300
100+
})
101+
elif log_level == "ERROR":
102+
self.generate_log("ERROR", "This is an error log.", {
103+
"error_details": {
104+
"error_code": "500",
105+
"error_message": "Internal Server Error"
106+
}
107+
})
108+
time.sleep(interval)
109+
threading.Thread(target=generate_logs).start()

run_nodes.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
# run_nodes.py
2+
from node import Node
3+
4+
if __name__ == "__main__":
5+
services = ["PaymentService", "OrderService", "InventoryService"]
6+
nodes = [Node(service) for service in services]
7+
8+
# Start log generation and heartbeat for each node
9+
for node in nodes:
10+
node.start_heartbeat()
11+
node.start_log_generation()

0 commit comments

Comments
 (0)