From 30fd7396b91d3937013b8223ad9415f12e2a3b77 Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Wed, 7 Aug 2024 10:45:10 +0100 Subject: [PATCH 1/5] server: prepend pod name to log grep --- src/warnet/backend/kubernetes_backend.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/warnet/backend/kubernetes_backend.py b/src/warnet/backend/kubernetes_backend.py index 4143e4f83..9acaedb83 100644 --- a/src/warnet/backend/kubernetes_backend.py +++ b/src/warnet/backend/kubernetes_backend.py @@ -336,7 +336,8 @@ def logs_grep(self, pattern: str, network: str): for log_entry in log_stream: log_entry_str = log_entry.decode("utf-8").strip() if compiled_pattern.search(log_entry_str): - matching_logs.append(log_entry_str) + pod_prefixed_log = f"{pod.metadata.name}: {log_entry_str}" + matching_logs.append(pod_prefixed_log) except ApiException as e: print(f"Error fetching logs for pod {pod.metadata.name}: {e}") From a9da4e6878e4f27d6ae537028dfc147e6804cbd9 Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Wed, 7 Aug 2024 10:45:45 +0100 Subject: [PATCH 2/5] server: remove k8s timestamps --- src/warnet/backend/kubernetes_backend.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/warnet/backend/kubernetes_backend.py b/src/warnet/backend/kubernetes_backend.py index 9acaedb83..a9b2bf60f 100644 --- a/src/warnet/backend/kubernetes_backend.py +++ b/src/warnet/backend/kubernetes_backend.py @@ -329,7 +329,7 @@ def logs_grep(self, pattern: str, network: str): name=pod.metadata.name, container=BITCOIN_CONTAINER_NAME, namespace=self.namespace, - timestamps=True, + timestamps=False, _preload_content=False, ) From 5f518f52b1a60c4e15ce5b6264a33d7810b8613f Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Wed, 7 Aug 2024 11:03:44 +0100 Subject: [PATCH 3/5] server: add option to show k8s timestamps in log-grep --- src/warnet/backend/kubernetes_backend.py | 4 ++-- src/warnet/cli/bitcoin.py | 10 ++++++++-- src/warnet/server.py | 4 ++-- 3 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/warnet/backend/kubernetes_backend.py b/src/warnet/backend/kubernetes_backend.py index a9b2bf60f..49f806c87 100644 --- a/src/warnet/backend/kubernetes_backend.py +++ b/src/warnet/backend/kubernetes_backend.py @@ -313,7 +313,7 @@ def get_messages( messages.sort(key=lambda x: x["time"]) return messages - def logs_grep(self, pattern: str, network: str): + def logs_grep(self, pattern: str, network: str, k8s_timestamps=False): compiled_pattern = re.compile(pattern) matching_logs = [] @@ -329,7 +329,7 @@ def logs_grep(self, pattern: str, network: str): name=pod.metadata.name, container=BITCOIN_CONTAINER_NAME, namespace=self.namespace, - timestamps=False, + timestamps=k8s_timestamps, _preload_content=False, ) diff --git a/src/warnet/cli/bitcoin.py b/src/warnet/cli/bitcoin.py index 8dea2a3a4..611d5084c 100644 --- a/src/warnet/cli/bitcoin.py +++ b/src/warnet/cli/bitcoin.py @@ -47,9 +47,15 @@ def messages(node_a, node_b, network): @bitcoin.command() @click.argument("pattern", type=str, required=True) +@click.option("--show-k8s-timestamps", is_flag=True, default=False, show_default=True) @click.option("--network", default="warnet", show_default=True) -def grep_logs(pattern, network): +def grep_logs(pattern, network, show_k8s_timestamps): """ Grep combined logs via fluentd using regex """ - print(rpc_call("logs_grep", {"network": network, "pattern": pattern})) + print( + rpc_call( + "logs_grep", + {"network": network, "pattern": pattern, "k8s_timestamps": show_k8s_timestamps}, + ) + ) diff --git a/src/warnet/server.py b/src/warnet/server.py index 13066482c..a5e3786e2 100644 --- a/src/warnet/server.py +++ b/src/warnet/server.py @@ -570,13 +570,13 @@ def generate_deployment(self, graph_file: str, network: str = "warnet") -> str: self.logger.error(msg) raise ServerError(message=msg) from e - def logs_grep(self, pattern: str, network: str = "warnet") -> str: + def logs_grep(self, pattern: str, network: str = "warnet", k8s_timestamps=False) -> str: """ Grep the logs from the fluentd container for a regex pattern """ try: wn = self.get_warnet(network) - return wn.container_interface.logs_grep(pattern, network) + return wn.container_interface.logs_grep(pattern, network, k8s_timestamps) except Exception as e: msg = f"Error grepping logs using pattern {pattern}: {e}" self.logger.error(msg) From 0c5dc6e7a9119647471e0301c440c16621d7bc21 Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Wed, 7 Aug 2024 11:08:50 +0100 Subject: [PATCH 4/5] server: sort grep-logs --- src/warnet/backend/kubernetes_backend.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/src/warnet/backend/kubernetes_backend.py b/src/warnet/backend/kubernetes_backend.py index 49f806c87..af5e69d58 100644 --- a/src/warnet/backend/kubernetes_backend.py +++ b/src/warnet/backend/kubernetes_backend.py @@ -316,13 +316,9 @@ def get_messages( def logs_grep(self, pattern: str, network: str, k8s_timestamps=False): compiled_pattern = re.compile(pattern) matching_logs = [] - pods = self.client.list_namespaced_pod(self.namespace) - - # TODO: Can adapt to only search lnd or bitcoind containers? relevant_pods = [pod for pod in pods.items if "warnet" in pod.metadata.name] - # Iterate through the filtered pods to fetch and search logs for pod in relevant_pods: try: log_stream = self.client.read_namespaced_pod_log( @@ -332,16 +328,18 @@ def logs_grep(self, pattern: str, network: str, k8s_timestamps=False): timestamps=k8s_timestamps, _preload_content=False, ) - for log_entry in log_stream: log_entry_str = log_entry.decode("utf-8").strip() if compiled_pattern.search(log_entry_str): - pod_prefixed_log = f"{pod.metadata.name}: {log_entry_str}" - matching_logs.append(pod_prefixed_log) + matching_logs.append((log_entry_str, pod.metadata.name)) except ApiException as e: print(f"Error fetching logs for pod {pod.metadata.name}: {e}") - return "\n".join(matching_logs) + sorted_logs = sorted(matching_logs, key=lambda x: x[0]) + # Prepend pod names + formatted_logs = [f"{pod_name}: {log}" for log, pod_name in sorted_logs] + + return "\n".join(formatted_logs) def generate_deployment_file(self, warnet): """ From 5a32ceeea4c70a8dc6a9fe44ca5217b7775e68d1 Mon Sep 17 00:00:00 2001 From: willcl-ark Date: Wed, 7 Aug 2024 11:19:32 +0100 Subject: [PATCH 5/5] server: add no_sort option to grep-logs --- src/warnet/backend/kubernetes_backend.py | 4 ++-- src/warnet/cli/bitcoin.py | 10 ++++++++-- src/warnet/server.py | 6 ++++-- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/src/warnet/backend/kubernetes_backend.py b/src/warnet/backend/kubernetes_backend.py index af5e69d58..f8821888d 100644 --- a/src/warnet/backend/kubernetes_backend.py +++ b/src/warnet/backend/kubernetes_backend.py @@ -313,7 +313,7 @@ def get_messages( messages.sort(key=lambda x: x["time"]) return messages - def logs_grep(self, pattern: str, network: str, k8s_timestamps=False): + def logs_grep(self, pattern: str, network: str, k8s_timestamps=False, no_sort=False): compiled_pattern = re.compile(pattern) matching_logs = [] pods = self.client.list_namespaced_pod(self.namespace) @@ -335,7 +335,7 @@ def logs_grep(self, pattern: str, network: str, k8s_timestamps=False): except ApiException as e: print(f"Error fetching logs for pod {pod.metadata.name}: {e}") - sorted_logs = sorted(matching_logs, key=lambda x: x[0]) + sorted_logs = matching_logs if no_sort else sorted(matching_logs, key=lambda x: x[0]) # Prepend pod names formatted_logs = [f"{pod_name}: {log}" for log, pod_name in sorted_logs] diff --git a/src/warnet/cli/bitcoin.py b/src/warnet/cli/bitcoin.py index 611d5084c..0c01f7d0d 100644 --- a/src/warnet/cli/bitcoin.py +++ b/src/warnet/cli/bitcoin.py @@ -48,14 +48,20 @@ def messages(node_a, node_b, network): @bitcoin.command() @click.argument("pattern", type=str, required=True) @click.option("--show-k8s-timestamps", is_flag=True, default=False, show_default=True) +@click.option("--no-sort", is_flag=True, default=False, show_default=True) @click.option("--network", default="warnet", show_default=True) -def grep_logs(pattern, network, show_k8s_timestamps): +def grep_logs(pattern, network, show_k8s_timestamps, no_sort): """ Grep combined logs via fluentd using regex """ print( rpc_call( "logs_grep", - {"network": network, "pattern": pattern, "k8s_timestamps": show_k8s_timestamps}, + { + "network": network, + "pattern": pattern, + "k8s_timestamps": show_k8s_timestamps, + "no_sort": no_sort, + }, ) ) diff --git a/src/warnet/server.py b/src/warnet/server.py index a5e3786e2..b3fbda6dd 100644 --- a/src/warnet/server.py +++ b/src/warnet/server.py @@ -570,13 +570,15 @@ def generate_deployment(self, graph_file: str, network: str = "warnet") -> str: self.logger.error(msg) raise ServerError(message=msg) from e - def logs_grep(self, pattern: str, network: str = "warnet", k8s_timestamps=False) -> str: + def logs_grep( + self, pattern: str, network: str = "warnet", k8s_timestamps=False, no_sort=False + ) -> str: """ Grep the logs from the fluentd container for a regex pattern """ try: wn = self.get_warnet(network) - return wn.container_interface.logs_grep(pattern, network, k8s_timestamps) + return wn.container_interface.logs_grep(pattern, network, k8s_timestamps, no_sort) except Exception as e: msg = f"Error grepping logs using pattern {pattern}: {e}" self.logger.error(msg)