Skip to main content

API Bandwidth & Throughput Dashboard

Overview

The API Bandwidth & Throughput Dashboard provides comprehensive monitoring of data transfer patterns for your API. This dashboard focuses on request and response payload sizes, bandwidth usage, and throughput metrics. It helps identify endpoints with large payloads, track bandwidth consumption, and understand data transfer patterns across your API infrastructure.

Key Features

  • Bandwidth Monitoring: Track total bandwidth usage (request + response bytes)
  • Payload Size Analysis: Monitor request and response sizes with percentiles
  • Endpoint-Level Insights: Identify which endpoints transfer the most data
  • Method Analysis: Track bandwidth usage by HTTP method
  • Throughput Metrics: Bytes per second for requests and responses
  • Real-time Monitoring: Live metrics updated continuously from Prometheus

Dashboard Structure

The dashboard is organized into two main sections:

  1. Summary Stats - Key bandwidth metrics at a glance (4 stat panels)
  2. Bandwidth & Throughput - Detailed time-series analysis (5 time-series panels)

Summary Stats

The Summary Stats section provides four critical bandwidth metrics for quick assessment.

Summary Stats

Total Bandwidth

Description: Total bandwidth usage combining both request and response bytes per second.

Metrics:

  • Total bytes per second (Bps)
  • Sum of request bandwidth + response bandwidth

Query:

sum(rate(http_server_request_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m])) + sum(rate(http_server_response_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m]))

Use Cases:

  • Monitor total bandwidth consumption
  • Capacity planning

Interpretation:

  • Total data transfer rate across all endpoints

Avg Request Size

Description: Average size of incoming request payloads in bytes.

Metrics:

  • Mean request size (bytes)
  • Calculated across all requests

Query:

sum(rate(http_server_request_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m])) / sum(rate(http_server_request_size_bytes_count{job="otel-collector", namespace="dynamoai"}[1m]))

Use Cases:

  • Identify endpoints with large request payloads
  • Monitor request size patterns

Interpretation:

  • Average incoming payload size

Avg Response Size

Description: Average size of outgoing response payloads in bytes.

Metrics:

  • Mean response size (bytes)
  • Calculated across all responses

Query:

sum(rate(http_server_response_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m])) / sum(rate(http_server_response_size_count{job="otel-collector", namespace="dynamoai"}[1m]))

Use Cases:

  • Identify endpoints with large response payloads
  • Monitor response size patterns

Interpretation:

  • Average outgoing payload size

Request Bandwidth

Description: Total incoming bandwidth (request bytes per second).

Metrics:

  • Request bytes per second (Bps)
  • Incoming data transfer rate

Query:

sum(rate(http_server_request_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m]))

Use Cases:

  • Monitor incoming data transfer rate
  • Capacity planning

Interpretation:

  • Rate of incoming data

Bandwidth & Throughput

This section provides detailed time-series analysis of bandwidth usage and payload sizes.

Bandwidth & Throughput

Total Bandwidth Usage

Description: Stacked time-series graph showing both request and response bandwidth over time.

Metrics:

  • Request Bandwidth: Incoming bytes per second
  • Response Bandwidth: Outgoing bytes per second
  • Total: Sum of both (visualized as stacked)

Queries:

# Request Bandwidth
sum(rate(http_server_request_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m]))

# Response Bandwidth
sum(rate(http_server_response_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m]))

Use Cases:

  • Monitor bandwidth usage over time
  • Identify bandwidth spikes
  • Capacity planning

Visualization: Stacked line graph with two series (Request and Response)

Interpretation:

  • Stack height shows total bandwidth (request + response)

Average Payload Sizes

Description: Time-series graph showing average request and response payload sizes over time.

Metrics:

  • Avg Request Size: Mean incoming payload size (bytes)
  • Avg Response Size: Mean outgoing payload size (bytes)

Queries:

# Avg Request Size
sum(rate(http_server_request_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m])) / sum(rate(http_server_request_size_bytes_count{job="otel-collector", namespace="dynamoai"}[1m]))

# Avg Response Size
sum(rate(http_server_response_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m])) / sum(rate(http_server_response_size_bytes_count{job="otel-collector", namespace="dynamoai"}[1m]))

Use Cases:

  • Track payload size trends
  • Compare request vs response sizes
  • Optimization targeting

Visualization: Two-line graph with request and response sizes

Interpretation:

  • Payload size trends over time

Payload Size Percentiles (Request & Response)

Description: Comprehensive payload size distribution showing multiple percentiles for both requests and responses.

Metrics:

  • Request P50, P90, P95, P99: Percentiles for request payload sizes
  • Response P50, P90, P95, P99: Percentiles for response payload sizes

Queries:

# Request Percentiles
histogram_quantile(0.50, sum by(le) (rate(http_server_request_size_bytes_bucket{job="otel-collector", namespace="dynamoai"}[5m])))
histogram_quantile(0.90, sum by(le) (rate(http_server_request_size_bytes_bucket{job="otel-collector", namespace="dynamoai"}[5m])))
histogram_quantile(0.95, sum by(le) (rate(http_server_request_size_bytes_bucket{job="otel-collector", namespace="dynamoai"}[5m])))
histogram_quantile(0.99, sum by(le) (rate(http_server_request_size_bytes_bucket{job="otel-collector", namespace="dynamoai"}[5m])))

# Response Percentiles
histogram_quantile(0.50, sum by(le) (rate(http_server_response_size_bytes_bucket{job="otel-collector", namespace="dynamoai"}[5m])))
histogram_quantile(0.90, sum by(le) (rate(http_server_response_size_bytes_bucket{job="otel-collector", namespace="dynamoai"}[5m])))
histogram_quantile(0.95, sum by(le) (rate(http_server_response_size_bytes_bucket{job="otel-collector", namespace="dynamoai"}[5m])))
histogram_quantile(0.99, sum by(le) (rate(http_server_response_size_bytes_bucket{job="otel-collector", namespace="dynamoai"}[5m])))

Use Cases:

  • Identify tail payload sizes (P90, P95, P99)
  • Compare request vs response distributions

Visualization: Multi-line graph with eight series (4 for requests, 4 for responses)

Interpretation:

  • P50: median, P90/P95/P99: tail payload sizes

Bandwidth by Endpoint

Description: Total bandwidth usage (request + response) broken down by individual API endpoints.

Metrics:

  • Total bandwidth per endpoint (bytes per second)
  • Sum of request and response bandwidth for each path

Query:

sum by (path) (rate(http_server_request_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m]) + rate(http_server_response_size_bytes_sum{job="otel-collector", namespace="dynamoai"}[1m]))

Use Cases:

  • Identify high-bandwidth endpoints
  • Prioritize optimization efforts

Visualization: Multi-line graph with one line per endpoint, sorted by max bandwidth

Interpretation:

  • Total bandwidth per endpoint (request + response)

Technical Details

Metric Details

All metrics are collected via OpenTelemetry instrumentation using nestjs-otel:

Histogram Metrics (for payload sizes):

  • http_server_request_size_bytes_sum: Total request bytes sum
  • http_server_request_size_bytes_count: Total request count
  • http_server_request_size_bytes_bucket: Histogram buckets for percentiles
  • http_server_response_size_bytes_sum: Total response bytes sum
  • http_server_response_size_bytes_count: Total response count
  • http_server_response_size_bytes_bucket: Histogram buckets for percentiles

Labels Available:

  • method: HTTP method (GET, POST, PUT, DELETE, etc.)
  • path: API endpoint path
  • status: HTTP status code
  • namespace: Kubernetes namespace (dynamoai)
  • job: Prometheus job label (otel-collector)

Last Updated: [24/11/2025]