diff --git a/dashboards/apigee/README.md b/dashboards/apigee/README.md index 0cc90fb9c8..f56ba4ab19 100644 --- a/dashboards/apigee/README.md +++ b/dashboards/apigee/README.md @@ -4,6 +4,13 @@ - These dashboards are for [Apigee Hybrid](https://cloud.google.com/apigee/hybrid) +|Apigee API Health & Availability| +|:---------------------------------| +|Filename:[health-availability.json](health-availability.json)| +|This dashboard provides high-level health and availability monitoring for Apigee proxies, including request rates and error breakdowns by proxy.| + +- The following dashboards are for [Apigee Hybrid](https://cloud.google.com/apigee/hybrid) + |Apigee Hybrid Cassandra Monitoring| |:---------------------------------| |Filename:[hybrid-cassandra-monitoring.json](hybrid-cassandra-monitoring.json)| diff --git a/dashboards/apigee/health-availability.json b/dashboards/apigee/health-availability.json new file mode 100644 index 0000000000..c21e19459d --- /dev/null +++ b/dashboards/apigee/health-availability.json @@ -0,0 +1,266 @@ +{ + "displayName": "Apigee API Health & Availability", + "dashboardFilters": [ + { + "filterType": "RESOURCE_LABEL", + "labelKey": "project_id", + "valueType": "STRING" + }, + { + "filterType": "RESOURCE_LABEL", + "labelKey": "location", + "valueType": "STRING" + }, + { + "filterType": "RESOURCE_LABEL", + "labelKey": "proxy_name", + "valueType": "STRING" + } + ], + "description": "Monitor direct impact on API availability and overall success rates.", + "mosaicLayout": { + "columns": 48, + "tiles": [ + { + "xPos": 0, + "yPos": 0, + "height": 8, + "width": 16, + "widget": { + "title": "Traffic", + "scorecard": { + "timeSeriesQuery": { + "outputFullDuration": false, + "timeSeriesFilter": { + "aggregation": { + "alignmentPeriod": "60s", + "crossSeriesReducer": "REDUCE_SUM", + "perSeriesAligner": "ALIGN_RATE" + }, + "filter": "metric.type=\"apigee.googleapis.com/proxyv2/request_count\" resource.type=\"apigee.googleapis.com/ProxyV2\"" + } + } + } + } + }, + { + "xPos": 16, + "yPos": 0, + "height": 8, + "width": 16, + "widget": { + "title": "Error Rate (5xx)", + "scorecard": { + "timeSeriesQuery": { + "outputFullDuration": false, + "timeSeriesFilter": { + "aggregation": { + "alignmentPeriod": "60s", + "crossSeriesReducer": "REDUCE_SUM", + "perSeriesAligner": "ALIGN_RATE" + }, + "filter": "metric.type=\"apigee.googleapis.com/proxyv2/response_count\" resource.type=\"apigee.googleapis.com/ProxyV2\" metric.label.\"response_code\"=monitoring.regex.full_match(\"5.*\")" + } + } + } + } + }, + { + "xPos": 32, + "yPos": 0, + "height": 8, + "width": 16, + "widget": { + "title": "Latency (p95)", + "scorecard": { + "timeSeriesQuery": { + "outputFullDuration": false, + "timeSeriesFilter": { + "aggregation": { + "alignmentPeriod": "60s", + "crossSeriesReducer": "REDUCE_MEAN", + "perSeriesAligner": "ALIGN_MEAN" + }, + "filter": "metric.type=\"apigee.googleapis.com/proxyv2/latencies_percentile\" resource.type=\"apigee.googleapis.com/ProxyV2\" metric.label.\"percentile\"=\"p95\"" + } + } + } + } + }, + { + "xPos": 0, + "yPos": 8, + "height": 16, + "width": 48, + "widget": { + "title": "Request Rate by Status Code", + "xyChart": { + "chartOptions": { + "displayHorizontal": false, + "mode": "COLOR", + "showLegend": false + }, + "dataSets": [ + { + "minAlignmentPeriod": "60s", + "plotType": "LINE", + "targetAxis": "Y1", + "timeSeriesQuery": { + "outputFullDuration": false, + "timeSeriesFilter": { + "aggregation": { + "alignmentPeriod": "60s", + "crossSeriesReducer": "REDUCE_SUM", + "groupByFields": [ + "metric.label.\"response_code\"" + ], + "perSeriesAligner": "ALIGN_RATE" + }, + "filter": "metric.type=\"apigee.googleapis.com/proxyv2/response_count\" resource.type=\"apigee.googleapis.com/ProxyV2\"" + } + } + } + ], + "yAxis": { + "scale": "LINEAR" + } + } + } + }, + { + "xPos": 0, + "yPos": 24, + "height": 16, + "width": 24, + "widget": { + "title": "5xx Error Rate by Proxy", + "xyChart": { + "chartOptions": { + "displayHorizontal": false, + "mode": "COLOR", + "showLegend": false + }, + "dataSets": [ + { + "minAlignmentPeriod": "60s", + "plotType": "LINE", + "targetAxis": "Y1", + "timeSeriesQuery": { + "outputFullDuration": false, + "timeSeriesFilter": { + "aggregation": { + "alignmentPeriod": "60s", + "crossSeriesReducer": "REDUCE_SUM", + "groupByFields": [ + "resource.label.\"proxy_name\"" + ], + "perSeriesAligner": "ALIGN_RATE" + }, + "filter": "metric.type=\"apigee.googleapis.com/proxyv2/response_count\" resource.type=\"apigee.googleapis.com/ProxyV2\" metric.label.\"response_code\"=monitoring.regex.full_match(\"5.*\")" + } + } + }, + { + "minAlignmentPeriod": "60s", + "plotType": "LINE", + "targetAxis": "Y1", + "timeSeriesQuery": { + "outputFullDuration": false, + "timeSeriesFilter": { + "aggregation": { + "alignmentPeriod": "60s", + "crossSeriesReducer": "REDUCE_SUM", + "groupByFields": [ + "resource.label.\"proxy_name\"" + ], + "perSeriesAligner": "ALIGN_RATE" + }, + "filter": "metric.type=\"apigee.googleapis.com/proxyv2/request_count\" resource.type=\"apigee.googleapis.com/ProxyV2\"" + } + } + } + ], + "thresholds": [ + { + "color": "COLOR_UNSPECIFIED", + "direction": "DIRECTION_UNSPECIFIED", + "targetAxis": "Y1", + "value": 1 + } + ], + "yAxis": { + "scale": "LINEAR" + } + } + } + }, + { + "xPos": 24, + "yPos": 24, + "height": 16, + "width": 24, + "widget": { + "title": "4xx Error Rate by Proxy", + "xyChart": { + "chartOptions": { + "displayHorizontal": false, + "mode": "COLOR", + "showLegend": false + }, + "dataSets": [ + { + "minAlignmentPeriod": "60s", + "plotType": "LINE", + "targetAxis": "Y1", + "timeSeriesQuery": { + "outputFullDuration": false, + "timeSeriesFilter": { + "aggregation": { + "alignmentPeriod": "60s", + "crossSeriesReducer": "REDUCE_SUM", + "groupByFields": [ + "resource.label.\"proxy_name\"" + ], + "perSeriesAligner": "ALIGN_RATE" + }, + "filter": "metric.type=\"apigee.googleapis.com/proxyv2/response_count\" resource.type=\"apigee.googleapis.com/ProxyV2\" metric.label.\"response_code\"=monitoring.regex.full_match(\"4.*\")" + } + } + }, + { + "minAlignmentPeriod": "60s", + "plotType": "LINE", + "targetAxis": "Y1", + "timeSeriesQuery": { + "outputFullDuration": false, + "timeSeriesFilter": { + "aggregation": { + "alignmentPeriod": "60s", + "crossSeriesReducer": "REDUCE_SUM", + "groupByFields": [ + "resource.label.\"proxy_name\"" + ], + "perSeriesAligner": "ALIGN_RATE" + }, + "filter": "metric.type=\"apigee.googleapis.com/proxyv2/request_count\" resource.type=\"apigee.googleapis.com/ProxyV2\"" + } + } + } + ], + "thresholds": [ + { + "color": "COLOR_UNSPECIFIED", + "direction": "DIRECTION_UNSPECIFIED", + "targetAxis": "Y1", + "value": 1 + } + ], + "yAxis": { + "scale": "LINEAR" + } + } + } + } + ] + } +} \ No newline at end of file diff --git a/dashboards/apigee/health-availability.png b/dashboards/apigee/health-availability.png new file mode 100644 index 0000000000..3b05187e67 Binary files /dev/null and b/dashboards/apigee/health-availability.png differ diff --git a/dashboards/apigee/metadata.yaml b/dashboards/apigee/metadata.yaml index ad48a6cd01..a33c11760b 100644 --- a/dashboards/apigee/metadata.yaml +++ b/dashboards/apigee/metadata.yaml @@ -1,4 +1,14 @@ sample_dashboards: + - + category: Apigee + id: health-availability + display_name: Apigee API Health & Availability + description: |- + This dashboard is for [Apigee](https://cloud.google.com/apigee). + This dashboard provides high-level health and availability monitoring for Apigee proxies, including request rates and error breakdowns by proxy. + related_integrations: + - id: apigee + platform: GCP - category: Apigee id: hybrid-cassandra-monitoring