From 9e37af4fe96e798b9e1b112b2ed8ecd52924520d Mon Sep 17 00:00:00 2001 From: Remco Beckers Date: Mon, 17 Nov 2025 11:34:35 +0100 Subject: [PATCH 1/4] STAC-23822 Add hdfs status report to log collection --- .../attachments/suse-observability_logs_collector.sh | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh b/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh index 8bfe30c2..ceb7afd1 100644 --- a/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh +++ b/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh @@ -247,6 +247,15 @@ EOF kill $CHILD } +collect_hdfs_report() { + POD=$(kubectl -n "$NAMESPACE" get pod -l app.kubernetes.io/component=hdfs-nn -o jsonpath='{.items[0].metadata.name}' 2>/dev/null) || true + if [ -n "$POD" ]; then + techo "Collecting HDFS report..." + mkdir -p "$OUTPUT_DIR/pods/$pod" + kubectl exec -n "$NAMESPACE" "$POD" -c namenode -- bash -c "unset HADOOP_OPTS; hdfs dfsadmin -report" >> "$OUTPUT_DIR/pods/$pod/hdfs-report.log" + fi +} + archive_and_cleanup() { echo "Creating archive $ARCHIVE_FILE..." tar -czf "$ARCHIVE_FILE" "$OUTPUT_DIR" @@ -303,6 +312,7 @@ kubectl -n "$NAMESPACE" get events --sort-by='.metadata.creationTimestamp' > "$O # Run the pod logs collection function collect_pod_logs collect_pod_disk_usage +collect_hdfs_report collect_yaml_configs if [ $HELM_RELEASES ]; then collect_helm_releases From f1ec631dae8ea15ba1aca050951d0cc9a07e3c83 Mon Sep 17 00:00:00 2001 From: Remco Beckers Date: Mon, 17 Nov 2025 12:12:45 +0100 Subject: [PATCH 2/4] STAC-23822 Fix boolean logic for ES and helm values collection --- .../attachments/suse-observability_logs_collector.sh | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh b/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh index ceb7afd1..568894aa 100644 --- a/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh +++ b/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh @@ -1,6 +1,6 @@ #!/bin/bash -ELASTICSEARCH_LOGS=0 +ELASTICSEARCH_LOGS=false ELASTICSEARCH_RANGE="7d" while getopts "her:" option; do case $option in @@ -23,7 +23,7 @@ options: EOF exit 0;; e) # Collect elasticsearch logs - ELASTICSEARCH_LOGS=1;; + ELASTICSEARCH_LOGS=true;; r) # Time range for elasticsearch logs ELASTICSEARCH_RANGE=$OPTARG;; \?) # Invalid option @@ -49,12 +49,12 @@ for cmd in ${COMMANDS[@]}; do done # skip helm release analysis when not all its dependencies are present -HELM_RELEASES=1 +HELM_RELEASES=true for cmd in base64 gzip jq do if ! command -v $cmd &>/dev/null; then echo "$cmd is not installed. Skipping analysis of helm releases." - HELM_RELEASES=0 + HELM_RELEASES=false fi done @@ -314,10 +314,10 @@ collect_pod_logs collect_pod_disk_usage collect_hdfs_report collect_yaml_configs -if [ $HELM_RELEASES ]; then +if $HELM_RELEASES; then collect_helm_releases fi -if [ $ELASTICSEARCH_LOGS ]; then +if $ELASTICSEARCH_LOGS; then collect_pod_logs_from_elasticsearch fi From 4bd2fc00c41cd9c4a725d4bc76745affe3ff34dd Mon Sep 17 00:00:00 2001 From: Remco Beckers Date: Mon, 17 Nov 2025 12:13:02 +0100 Subject: [PATCH 3/4] STAC-23822 Add collection of hbase and hdfs reports --- .../suse-observability_logs_collector.sh | 25 +++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh b/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh index 568894aa..6a7102b6 100644 --- a/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh +++ b/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh @@ -251,8 +251,28 @@ collect_hdfs_report() { POD=$(kubectl -n "$NAMESPACE" get pod -l app.kubernetes.io/component=hdfs-nn -o jsonpath='{.items[0].metadata.name}' 2>/dev/null) || true if [ -n "$POD" ]; then techo "Collecting HDFS report..." - mkdir -p "$OUTPUT_DIR/pods/$pod" - kubectl exec -n "$NAMESPACE" "$POD" -c namenode -- bash -c "unset HADOOP_OPTS; hdfs dfsadmin -report" >> "$OUTPUT_DIR/pods/$pod/hdfs-report.log" + mkdir -p "$OUTPUT_DIR/reports" + kubectl exec -n "$NAMESPACE" "$POD" -c namenode -- bash -c "unset HADOOP_OPTS; hdfs dfsadmin -report" > "$OUTPUT_DIR/reports/hdfs.log" + fi +} + +collect_hbase_report() { + POD=$(kubectl -n "$NAMESPACE" get pod -l app.kubernetes.io/component=hbase-master -o jsonpath='{.items[0].metadata.name}' 2>/dev/null) || true + if [ -n "$POD" ]; then + # Running in HA Mode + techo "Collecting HBase report..." + mkdir -p "$OUTPUT_DIR/reports" + kubectl exec -n "$NAMESPACE" "$POD" -c master -- bash -c 'hbase hbck -details 2>&1' > "$OUTPUT_DIR/reports/hbase.log" + else + POD=$(kubectl -n "$NAMESPACE" get pod -l app.kubernetes.io/component=stackgraph -o jsonpath='{.items[0].metadata.name}' 2>/dev/null) || true + if [ -n "$POD" ]; then + # Running in non-HA mode + techo "Collecting HBase report..." + mkdir -p "$OUTPUT_DIR/reports" + kubectl exec -n "$NAMESPACE" "$POD" -c stackgraph -- bash -c 'hbase hbck -details 2>&1' > "$OUTPUT_DIR/reports/hbase.log" + else + techo "Could not find HBase or StackGraph pod to generate HBase report." + fi fi } @@ -313,6 +333,7 @@ kubectl -n "$NAMESPACE" get events --sort-by='.metadata.creationTimestamp' > "$O collect_pod_logs collect_pod_disk_usage collect_hdfs_report +collect_hbase_report collect_yaml_configs if $HELM_RELEASES; then collect_helm_releases From dd5391fb8671ae911a5ae913e6d41350e36c9cb8 Mon Sep 17 00:00:00 2001 From: Remco Beckers Date: Mon, 17 Nov 2025 15:00:36 +0100 Subject: [PATCH 4/4] Only keep the relevant parts of the helm config --- .../suse-observability_logs_collector.sh | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh b/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh index 6a7102b6..c52af5b3 100644 --- a/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh +++ b/docs/latest/modules/en/attachments/suse-observability_logs_collector.sh @@ -130,11 +130,25 @@ collect_pod_disk_usage() { collect_helm_releases() { techo "Collecting helm releases..." mkdir -p "$OUTPUT_DIR/releases" + + # Restrict keys extracted from Helm values to only this include-list to avoid including any + included_keys='["resources", "affinity", "nodeSelector", "tolerations"]' + + # 1. --argjson keys "$included_keys": Passes the shell variable as a JSON array $keys. + # 2. . as $input: Saves the entire original JSON into a variable $input. + # 3. [ paths | ... ]: Gathers all paths from the JSON. + # 4. select(.[-1] as $last | $keys | index($last)): Selects only paths where + # the last element (.[-1]) is found inside the $keys array. + # 5. reduce .[] as $p (null; ...): Starts with an empty (null) document + # and iterates over every path ($p) that was selected. + # 6. setpath($p; $input | getpath($p)): For each path, it sets that path + # in the *new* document, pulling the *value* from the original $input. + RELEASES=$(kubectl -n "$NAMESPACE" get secrets -l owner=helm -o jsonpath="{.items[*].metadata.name}") for release in $RELEASES; do kubectl -n "$NAMESPACE" get secret "$release" -o jsonpath='{.data.release}' | \ base64 --decode | base64 --decode | gzip -d | \ - jq '{ info: .info, metadata: .chart.metadata, config: .config }' > "$OUTPUT_DIR/releases/$release" + jq --argjson keys "$included_keys" '{ info: .info, metadata: .chart.metadata, config: ( .config as $input | [ .config | paths | select(.[-1] as $last | $keys | index($last)) ] | reduce .[] as $p (null; setpath($p; $input | getpath($p)))) }' > "$OUTPUT_DIR/releases/$release" done }