Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/db/slb_stats_queries.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/db/slb_stats_queries.py	(revision 2743)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/db/slb_stats_queries.py	(working copy)
@@ -683,6 +683,120 @@
 
         field_casts = {
             "connections": int
+        }
+        response["data"] = cast_fields(response["data"], field_casts)
+        return response
+
+    @staticmethod
+    def get_real_service_summary_data(agent_host, real_server_id, time_from, time_to):
+        """
+        Returns SLB Real Service summary stats aggregated over the full time range
+        for the given agent_host and real_server_id.
+        """
+        andebug('an.model.cli', 'Inside get_real_service_summary_data DB')
+        query = f"""
+            SELECT 
+                agent_host,
+                "real_server_id" AS rs_name,
+                addr,
+                port,
+                protocol,
+
+                -- Average metrics
+                COALESCE(CAST(AVG(rs_conn_cnt) AS bigint), 0) AS avg_conn_cnt,
+                COALESCE(CAST(AVG(rs_conn_per_sec) AS bigint), 0) AS avg_conn_per_sec,
+                COALESCE(ROUND(CAST(AVG(rs_in_byte_per_sec * 8) AS numeric), 2), 0) AS avg_in_byte_per_sec,
+                COALESCE(ROUND(CAST(AVG(rs_out_byte_per_sec * 8) AS numeric), 2), 0) AS avg_out_byte_per_sec,
+                COALESCE(AVG(rs_cnt_of_req), 0) AS avg_outstanding_req,
+
+                -- Average hits
+                COALESCE(
+                    ROUND(
+                        CAST(
+                            (
+                                MAX(rs_total_hits) - MIN(rs_total_hits)
+                            ) / EXTRACT(EPOCH FROM (MAX(time) - MIN(time)))
+                        AS numeric), 2), 0
+                ) AS avg_hits
+
+            FROM apv_real_stats
+            WHERE 
+                agent_host = '{agent_host}'
+                AND "real_server_id" = '{real_server_id}'
+                AND time >= {time_from}
+                AND time <= {time_to}
+            GROUP BY 
+                agent_host, "real_server_id", addr, port, protocol
+            ORDER BY "real_server_id";
+        """
+
+        req = {"query": query}
+        andebug('an.model.cli', f'req: {req}')
+        response = DBClient.execute_query(req)
+        andebug('an.model.cli', f'response: {response}')
+
+        field_casts = {
+            "avg_conn_cnt": float,
+            "avg_conn_per_sec": float,
+            "avg_in_byte_per_sec": float,
+            "avg_out_byte_per_sec": float,
+            "avg_outstanding_req": int,
+            "avg_hits": float
         }
         response["data"] = cast_fields(response["data"], field_casts)
         return response
+
+    @staticmethod
+    def get_real_service_historical_data(agent_host, real_server_id, interval, time_from, time_to):
+        """
+        Returns historical Real Service stats aggregated over time buckets.
+        Includes:
+          - Throughput (in/out)
+          - Connection count and connections/sec
+          - Total hits (delta)
+        """
+
+        query = f"""
+            SELECT
+                time_bucket_gapfill('{interval}', time, {time_from}, {time_to}) AS ts,
+                agent_host,
+                "real_server_id" AS rs_name,
+
+                -- Bandwidth (Bytes/sec)
+                COALESCE(AVG(rs_in_byte_per_sec), 0) AS avg_in_byte_per_sec,
+                COALESCE(AVG(rs_out_byte_per_sec), 0) AS avg_out_byte_per_sec,
+
+                -- Connections
+                COALESCE(AVG(rs_conn_cnt), 0) AS avg_conn_cnt,
+                COALESCE(AVG(rs_conn_per_sec), 0) AS avg_conn_per_sec,
+                
+                -- Requests
+                COALESCE(AVG(rs_cnt_of_req), 0) AS outstanding_req,
+
+                -- Total Hits (delta)
+                COALESCE(MAX(rs_total_hits) - MIN(rs_total_hits), 0) AS hit_diff
+
+            FROM apv_real_stats
+            WHERE agent_host ~ %s
+              AND real_server_id ~ %s
+              AND time >= {time_from}
+              AND time <= {time_to}
+            GROUP BY ts, agent_host, real_server_id
+            ORDER BY ts ASC;
+        """
+
+        params = [agent_host, real_server_id]
+        req = {"query": query, "params": params}
+        response = DBClient.execute_query(req)
+
+        field_casts = {
+            "avg_in_byte_per_sec": float,
+            "avg_out_byte_per_sec": float,
+            "avg_conn_cnt": int,
+            "avg_conn_per_sec": float,
+            "outstanding_req": int,
+            "hit_diff": int
+        }
+
+        response["data"] = cast_fields(response["data"], field_casts)
+        return response
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_pdf_report.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_pdf_report.py	(revision 2743)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_pdf_report.py	(working copy)
@@ -44,10 +44,21 @@
         """
         try:
             os.makedirs(REPORT_FILE_PATH, exist_ok=True)
-            pdf = SimpleDocTemplate(REPORT_FILE_PATH + filename, pagesize=letter)
+            pdf = SimpleDocTemplate(
+                REPORT_FILE_PATH + filename,
+                pagesize=letter,
+                leftMargin=50,
+                rightMargin=50
+            )
+
             elements = []
             styles = getSampleStyleSheet()
-            styles.add(ParagraphStyle(name="AMPReportHeading3", parent=styles["Heading3"], leftPadding=0))
+            styles.add(ParagraphStyle(name="AMPReportHeading3", parent=styles["Heading3"], leftPadding=0, alignment=0))
+            styles.add(ParagraphStyle(name="CenteredTitle", parent=styles["Title"], alignment=1))
+            # For all other text blocks:
+            styles.add(ParagraphStyle('LeftText', parent=styles["Normal"], alignment=0))
+            styles.add(ParagraphStyle('Heading3Left', parent=styles["Heading3"], alignment=0))
+            styles.add(ParagraphStyle('Heading4Left', parent=styles["Heading4"], alignment=0))
 
             # Header
             im = Image(LOGO_PATH, 2 * inch, 0.8 * inch)
@@ -63,10 +74,10 @@
                 category_name = str(category).upper()
 
             title = f"{category_name} Report"
-            elements.append(Paragraph(f"<b>{title}</b>", styles["Title"]))
+            elements.append(Paragraph(f"<b>{title}</b>", styles["CenteredTitle"]))
             elements += [Spacer(1, 20)]
-            elements.append(Paragraph(f"Statistics From : {start_time}", styles["Heading4"]))
-            elements.append(Paragraph(f"Statistics To   : {end_time}", styles["Heading4"]))
+            elements.append(Paragraph(f"Statistics From : {start_time}", styles["Heading4Left"]))
+            elements.append(Paragraph(f"Statistics To   : {end_time}", styles["Heading4Left"]))
             elements.append(Spacer(1, 10))
 
             # --- Summary Section ---
@@ -74,7 +85,8 @@
                 elements.append(Paragraph("Summary Report (Average values):", styles["AMPReportHeading3"]))
                 summary_headers, summary_fields = self.get_summary_headers_and_fields(category)
                 for entity_name, summary_data in data_summary_dict.items():
-                    row_values = [str(entity_name)] + [summary_data.get(field, 0) for field in summary_fields]
+                    row_values = [summary_data.get(field, entity_name if field == "entity_name" else 0)
+                                  for field in summary_fields]
                     table = self.get_table_data(summary_headers, [row_values])
                     elements += [Spacer(1, 15), table, Spacer(1, 25)]
 
@@ -84,7 +96,14 @@
                 section_config = self.get_detailed_sections(category)
 
                 for entity_name, metrics in data_dict.items():
-                    elements.append(Paragraph(f"Virtual Service Name: {str(entity_name)}", styles["Heading3"]))
+                    # Title
+                    if "vs" in category:
+                        label = "Virtual Service Name"
+                    elif "rs" in category:
+                        label = f"Real Service Name"
+                    else:
+                        label = str(entity_name)
+                    elements.append(Paragraph(f"{label}: {entity_name}", styles["Heading3Left"]))
                     elements.append(Spacer(1, 15))
 
                     # Render each subsection (e.g., throughput, usage, hits)
@@ -94,7 +113,7 @@
                         fields = section["fields"]
 
                         if title == 'Hits Distribution':
-                            elements.append(Paragraph("Hits Distribution", styles["Heading4"]))
+                            elements.append(Paragraph("Hits Distribution", styles["Heading4Left"]))
                             elements.append(Spacer(1, 10))
 
                             # Prepare data as [(hit_type, total), ...]
@@ -108,7 +127,7 @@
                             table = self.get_table_data(["Hit Type", "Number"], table_data)
                             elements += [table, Spacer(1, 25)]
                         else:
-                            elements.append(Paragraph(title, styles["Heading4"]))
+                            elements.append(Paragraph(title, styles["Heading4Left"]))
                             elements.append(Spacer(1, 10))
 
                             # Clean time format
@@ -130,7 +149,7 @@
     def get_table_data(self, headers, data):
         # Add Table Data
         data = [tuple(headers)] + data
-        table = Table(data, colWidths=int(480 / len(headers)), rowHeights=20)
+        table = Table(data, colWidths=int(540 / len(headers)), rowHeights=20)
         data_len = len(data)
 
         for each in range(data_len):
@@ -148,14 +167,20 @@
         if "llb" in category.lower():
             return (
                 ["Link Name", "Hits", "Connections", "Inbound (bps)", "Outbound (bps)", "Bandwidth Usage"],
-                ["avg_link_hits", "avg_link_conn", "avg_bandwidth_in", "avg_bandwidth_out", "avg_link_usage"]
+                ["entity_name", "avg_link_hits", "avg_link_conn", "avg_bandwidth_in", "avg_bandwidth_out", "avg_link_usage"]
             )
         elif "vs" in category.lower():
             return (
                 ["Virtual Service", "Conn Count", "Conn/sec", "Inbound (bps)", "Outbound (bps)", "Hits"],
-                ["avg_conn_cnt", "avg_conn_per_sec", "avg_in_byte_per_sec", "avg_out_byte_per_sec",
+                ["entity_name", "avg_conn_cnt", "avg_conn_per_sec", "avg_in_byte_per_sec", "avg_out_byte_per_sec",
                  "avg_hits_per_sec"]
             )
+        elif "rs" in category.lower():
+            return (
+                ["Real Service", "Conn Count", "Conn/sec", "Inbound (bps)", "Outbound (bps)", "Requests", "Hits"],
+                ["entity_name", "avg_conn_cnt", "avg_conn_per_sec", "avg_in_byte_per_sec", "avg_out_byte_per_sec",
+                 "avg_outstanding_req", "avg_hits_per_sec"]
+            )
         else:
             return ["Entity", "Metric1", "Metric2"], ["metric1", "metric2"]  # placeholder for future types
 
@@ -174,9 +199,18 @@
                 {"title": "Network Throughput (bps)", "headers": ["Time", "Inbound (bps)", "Outbound (bps)"],
                  "fields": ["avg_in_byte_per_sec", "avg_out_byte_per_sec"]},
                 {"title": "Hits", "headers": ["Time", "Hits"], "fields": ["hit_diff"]},
-                {"title": "Hits Distribution", "headers": ["Hit Type", "Number"], "fields": ["hit_diff"]},
+                {"title": "Hits Distribution", "headers": ["Hit Type", "Number"], "fields": []},
                 {"title": "Open Connections", "headers": ["Time", "Connection"], "fields": ["avg_conn_cnt"]},
                 {"title": "Connections Per Second", "headers": ["Time", "Connection"], "fields": ["avg_conn_per_sec"]},
             ]
+        elif "rs" in category.lower():
+            return [
+                {"title": "Network Throughput (bps)", "headers": ["Time", "Inbound (bps)", "Outbound (bps)"],
+                 "fields": ["avg_in_byte_per_sec", "avg_out_byte_per_sec"]},
+                {"title": "Outstanding Requests", "headers": ["Time", "Request"], "fields": ["outstanding_req"]},
+                {"title": "Requests Number", "headers": ["Time", "Hits"], "fields": ["hit_diff"]},
+                {"title": "Open Connections", "headers": ["Time", "Connection"], "fields": ["avg_conn_cnt"]},
+                {"title": "Connections Per Second", "headers": ["Time", "Connection"], "fields": ["avg_conn_per_sec"]},
+            ]
         else:
             return []
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py	(revision 2743)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/generate_report.py	(working copy)
@@ -4,7 +4,8 @@
 from django.http import JsonResponse, StreamingHttpResponse
 from hive.report.report_utils import get_dynamic_interval, to_epoch_ms, convert_relative_time, resolve_time_ranges
 from hive.report.report_data_service import get_llb_detailed_data, get_link_summary_data, \
-    get_virtual_service_detailed_data, get_virtual_service_summary_data
+    get_virtual_service_detailed_data, get_virtual_service_summary_data, get_real_service_summary_data, \
+    get_real_service_detailed_data
 from cm.lib.libbasic_operation import oper_log
 from hive.custom_exceptions import generic_exception as ge
 from hive.report.report_queries import ReportDB
@@ -30,6 +31,8 @@
                 return download_report(request.GET.get('filename'))
             elif path == 'log':
                 return get_all_report_log(request)
+            elif report_id:
+                return get_report(report_id)
             else:
                 return get_all_reports(request)
 
@@ -45,6 +48,21 @@
         return JsonResponse({"error": f"Unexpected error: {str(e)}"}, status=500)
 
 
+def get_report(report_id):
+    """
+    Handle GET request to fetch report data for report_id.
+    """
+    if not report_id:
+        return JsonResponse({"error": "Missing report_id"}, status=400)
+    try:
+        report_details = ReportDB.get_report_details(report_id)
+
+        return JsonResponse({"report data": report_details}, status=200, safe=False)
+    except Exception as e:
+        oper_log("error", "system", f"Fetch of Report data failed for report_id {report_id}: {str(e)}")
+        return JsonResponse({"error": f"FFetch of Report data failed for report id: {report_id}"}, status=500)
+
+
 def get_all_reports(request):
     """
     Handle GET request to fetch all reports.
@@ -58,7 +76,7 @@
         return JsonResponse({"reports": reports}, status=200, safe=False)
     except Exception as e:
         oper_log("error", "system", f"Unexpected error in get_all_reports: {str(e)}")
-        return JsonResponse({"error": f"Unexpected error: {str(e)}"}, status=500)
+        return JsonResponse({"error": f"Fetch of all the report data failed"}, status=500)
 
 
 def get_all_report_log(request):
@@ -74,7 +92,7 @@
         return JsonResponse({"report logs": report_logs}, status=200, safe=False)
     except Exception as e:
         oper_log("error", "system", f"Unexpected error in get_all_report_log: {str(e)}")
-        return JsonResponse({"error": f"Unexpected error: {str(e)}"}, status=500)
+        return JsonResponse({"error": f"Fetching the report logs failed"}, status=500)
 
 
 def save_report(request):
@@ -226,6 +244,10 @@
             agent_host = report.get("device_ip", "")
             vs_name = sub_name.split("(")[0].strip()
             report_name = generate_slb_vs_report(agent_host, vs_name, from_time, to_time, time_interval)
+        elif "SLB_rs" in sub_name:
+            agent_host = report.get("device_ip", "")
+            rs_name = sub_name.split("(")[0].strip()
+            report_name = generate_slb_rs_report(agent_host, rs_name, from_time, to_time, time_interval)
 
         file_path = os.path.join(REPORT_FILE_PATH, report_name)
         file_size = os.path.getsize(file_path) if os.path.exists(file_path) else 0
@@ -289,3 +311,24 @@
         report_name, "SLB_vs", data_dict, data_summary_dict, display_start_time_str, display_end_time_str
     )
     return report_name
+
+
+def generate_slb_rs_report(agent_host, rs_name, from_time, to_time, time_interval):
+    data_dict = get_real_service_detailed_data(agent_host, rs_name, from_time, to_time, time_interval)
+    data_summary_dict = get_real_service_summary_data(agent_host, rs_name, from_time, to_time)
+
+    (
+        interval_start,
+        interval_end,
+        filename_start_time_str,
+        filename_end_time_str,
+        display_start_time_str,
+        display_end_time_str,
+    ) = resolve_time_ranges(from_time, to_time)
+
+    report_name = f"SLB_RS_Statistics_Report_from_{filename_start_time_str}_to_{filename_end_time_str}.pdf"
+    report_generator = Report()
+    report_generator.generate_pdf_report(
+        report_name, "SLB_rs", data_dict, data_summary_dict, display_start_time_str, display_end_time_str
+    )
+    return report_name
Index: /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_data_service.py
===================================================================
--- /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_data_service.py	(revision 2743)
+++ /branches/amp_4_0/src/webui/webui/htdocs/new/src/hive/report/report_data_service.py	(working copy)
@@ -81,7 +81,7 @@
     try:
         from_time = convert_time(time_from, "now() - interval '15 minutes'")
         to_time = convert_time(time_to, "now()")
-        response = SLBStats.get_virtual_service_summary_data(agent_host, vs_name,from_time, to_time)
+        response = SLBStats.get_virtual_service_summary_data(agent_host, vs_name, from_time, to_time)
 
         if not response or "data" not in response or not isinstance(response["data"], list):
             return {}
@@ -150,4 +150,82 @@
         return slb_vs_dict
 
     except Exception as e:
-        return JsonResponse({"error": f"Error while fetching SLB Virtual Service data: {str(e)}"}, status=500)
\ No newline at end of file
+        return JsonResponse({"error": f"Error while fetching SLB Virtual Service data: {str(e)}"}, status=500)
+
+
+def get_real_service_summary_data(agent_host, rs_name, time_from, time_to):
+    """ Returns data for Real Service Summary Report """
+    andebug('an.model.cli', 'Inside get_real_service_summary_data')
+    try:
+        from_time = convert_time(time_from, "now() - interval '15 minutes'")
+        to_time = convert_time(time_to, "now()")
+        response = SLBStats.get_real_service_summary_data(agent_host, rs_name, from_time, to_time)
+        andebug('an.model.cli', f'Summary response: {response}')
+
+        if not response or "data" not in response or not isinstance(response["data"], list):
+            return {}
+
+        summary_dict = {}
+        for row in response["data"]:
+            rs_name = row.get("rs_name")
+            summary_dict[rs_name] = {
+                "avg_conn_cnt": row.get("avg_conn_cnt", 0),
+                "avg_conn_per_sec": row.get("avg_conn_per_sec", 0),
+                "avg_in_byte_per_sec": row.get("avg_in_byte_per_sec", 0),
+                "avg_out_byte_per_sec": row.get("avg_out_byte_per_sec", 0),
+                "avg_outstanding_req": row.get("avg_outstanding_req", 0),
+                "avg_hits": row.get("avg_hits", 0),
+            }
+
+        return summary_dict
+    except Exception as e:
+        return JsonResponse({"error": f"Error while fetching Real Service Summary data: {str(e)}"}, status=500)
+
+
+def get_real_service_detailed_data(agent_host, rs_name, time_from, time_to, interval="20s"):
+    """Returns detailed SLB Real Service statistics for report generation."""
+    andebug('an.model.cli', 'Inside get_real_service_detailed_data')
+    try:
+        from_time = convert_time(time_from, "now() - interval '15 minutes'")
+        to_time = convert_time(time_to, "now()")
+
+        response = SLBStats.get_real_service_historical_data(agent_host, rs_name, interval, from_time, to_time)
+        andebug('an.model.cli', f'Detailed response: {response}')
+
+        # Defensive check
+        if not response or "data" not in response or not isinstance(response["data"], list):
+            return {}
+
+        slb_rs_dict = {}
+
+        # Define all fields we want to capture (except time)
+        metric_fields = [
+            "avg_in_byte_per_sec", "avg_out_byte_per_sec", "avg_conn_cnt", "avg_conn_per_sec", "outstanding_req",
+            "hit_diff"
+        ]
+
+        for row in response["data"]:
+            real_service = row.get("rs_name", "unknown")
+            ts = row.get("ts")
+            if not ts:
+                continue
+
+            if real_service not in slb_rs_dict:
+                # Initialize lists for all fields
+                slb_rs_dict[real_service] = {"time": []}
+                for field in metric_fields:
+                    slb_rs_dict[real_service][field] = []
+
+            rs_data = slb_rs_dict[real_service]
+
+            # Append timestamp
+            rs_data["time"].append(ts)
+
+            # Append all metric fields dynamically
+            for field in metric_fields:
+                rs_data[field].append(row.get(field, 0))
+
+        return slb_rs_dict
+
+    except Exception as e:
+        return JsonResponse({"error": f"Error while fetching SLB Real Service data: {str(e)}"}, status=500)
