API Monitoring¶
Complete guide to monitoring, tracking, and optimizing Google Cloud API usage and performance.
📚 Overview¶
Effective API monitoring ensures reliability, performance, and cost optimization. This guide covers metrics, logging, alerting, and troubleshooting for GCP APIs.
Key Areas: - Usage Metrics: Track API calls, quotas, and limits - Performance: Monitor latency and error rates - Cost Tracking: Understand API-related costs - Alerting: Get notified of issues - Troubleshooting: Debug API problems
📊 API Metrics¶
1. Key Metrics to Monitor¶
┌────────────────────────────────────────────────────────┐
│ Essential API Metrics │
├────────────────────────────────────────────────────────┤
│ │
│ Request Metrics: │
│ • Request count (total API calls) │
│ • Requests per second (RPS) │
│ • Request size (bytes) │
│ • Response size (bytes) │
│ │
│ Performance Metrics: │
│ • Latency (p50, p95, p99) │
│ • Response time │
│ • Time to first byte (TTFB) │
│ • Backend latency │
│ │
│ Error Metrics: │
│ • Error rate (4xx, 5xx) │
│ • Error count by type │
│ • Quota exceeded errors │
│ • Authentication failures │
│ │
│ Quota Metrics: │
│ • Quota usage percentage │
│ • Quota limit │
│ • Quota exceeded count │
│ • Rate limit hits │
└────────────────────────────────────────────────────────┘
2. Viewing Metrics in Console¶
Navigation: APIs & Services → Dashboard
View:
• API requests (last 30 days)
• Traffic by API
• Errors by API
• Latency percentiles
• Quota usage
Filters:
• Time range
• Specific API
• Method
• Response code
3. Cloud Monitoring Metrics¶
# List API request metrics
gcloud monitoring time-series list \
--filter='metric.type="serviceruntime.googleapis.com/api/request_count"' \
--format=json
# Query specific API
gcloud monitoring time-series list \
--filter='metric.type="serviceruntime.googleapis.com/api/request_count" AND resource.labels.service="compute.googleapis.com"'
# View latency metrics
gcloud monitoring time-series list \
--filter='metric.type="serviceruntime.googleapis.com/api/request_latencies"'
# View quota usage
gcloud monitoring time-series list \
--filter='metric.type="serviceruntime.googleapis.com/quota/allocation/usage"'
# View error rates
gcloud monitoring time-series list \
--filter='metric.type="serviceruntime.googleapis.com/api/request_count" AND metric.labels.response_code_class="5xx"'
📝 API Logging¶
1. Enable API Audit Logs¶
# Enable audit logs for all services
# Via Console: IAM & Admin → Audit Logs
# Enable for specific service
gcloud projects set-iam-policy PROJECT_ID policy.json
# policy.json
{
"auditConfigs": [
{
"service": "compute.googleapis.com",
"auditLogConfigs": [
{"logType": "ADMIN_READ"},
{"logType": "DATA_READ"},
{"logType": "DATA_WRITE"}
]
}
]
}
2. Query API Logs¶
# View all API calls
gcloud logging read \
'protoPayload.serviceName="compute.googleapis.com"' \
--limit=50 \
--format=json
# View failed API calls
gcloud logging read \
'protoPayload.serviceName="compute.googleapis.com" AND protoPayload.status.code!=0' \
--limit=50
# View specific method calls
gcloud logging read \
'protoPayload.methodName="v1.compute.instances.insert"' \
--limit=50
# View API calls by user
gcloud logging read \
'protoPayload.authenticationInfo.principalEmail="alice@company.com"' \
--limit=50
# View quota exceeded errors
gcloud logging read \
'protoPayload.status.message=~"quota"' \
--limit=50
3. Structured Logging Query¶
# Complex query with multiple filters
gcloud logging read '
resource.type="api"
AND protoPayload.serviceName="compute.googleapis.com"
AND protoPayload.methodName=~"instances"
AND timestamp>="2026-03-01T00:00:00Z"
AND timestamp<"2026-03-31T23:59:59Z"
' --limit=100 --format=json
🚨 Alerting¶
1. Create Alert Policies¶
# Alert on high error rate
gcloud alpha monitoring policies create \
--notification-channels=CHANNEL_ID \
--display-name="High API Error Rate" \
--condition-display-name="Error rate > 5%" \
--condition-threshold-value=0.05 \
--condition-threshold-duration=300s \
--condition-filter='
metric.type="serviceruntime.googleapis.com/api/request_count"
AND metric.labels.response_code_class="5xx"
'
# Alert on quota usage
gcloud alpha monitoring policies create \
--notification-channels=CHANNEL_ID \
--display-name="High Quota Usage" \
--condition-display-name="Quota usage > 80%" \
--condition-threshold-value=0.8 \
--condition-threshold-duration=300s \
--condition-filter='
metric.type="serviceruntime.googleapis.com/quota/allocation/usage"
'
# Alert on high latency
gcloud alpha monitoring policies create \
--notification-channels=CHANNEL_ID \
--display-name="High API Latency" \
--condition-display-name="P95 latency > 1s" \
--condition-threshold-value=1000 \
--condition-threshold-duration=300s \
--condition-filter='
metric.type="serviceruntime.googleapis.com/api/request_latencies"
'
2. Log-Based Alerts¶
# Alert on specific error messages
gcloud logging sinks create api-error-alert \
--log-filter='
protoPayload.status.code!=0
AND protoPayload.serviceName="compute.googleapis.com"
' \
--destination=pubsub.googleapis.com/projects/PROJECT_ID/topics/api-errors
# Alert on quota exceeded
gcloud logging sinks create quota-exceeded-alert \
--log-filter='protoPayload.status.message=~"quota exceeded"' \
--destination=pubsub.googleapis.com/projects/PROJECT_ID/topics/quota-alerts
# Alert on authentication failures
gcloud logging sinks create auth-failure-alert \
--log-filter='protoPayload.status.code=7' \
--destination=pubsub.googleapis.com/projects/PROJECT_ID/topics/auth-failures
📈 Custom Dashboards¶
1. Create Monitoring Dashboard¶
from google.cloud import monitoring_dashboard_v1
def create_api_monitoring_dashboard(project_id):
"""Create comprehensive API monitoring dashboard"""
client = monitoring_dashboard_v1.DashboardsServiceClient()
dashboard = monitoring_dashboard_v1.Dashboard(
display_name="API Monitoring Dashboard",
grid_layout=monitoring_dashboard_v1.GridLayout(
widgets=[
# Request count widget
monitoring_dashboard_v1.Widget(
title="API Request Count",
xy_chart=monitoring_dashboard_v1.XyChart(
data_sets=[
monitoring_dashboard_v1.XyChart.DataSet(
time_series_query=monitoring_dashboard_v1.TimeSeriesQuery(
time_series_filter=monitoring_dashboard_v1.TimeSeriesFilter(
filter='metric.type="serviceruntime.googleapis.com/api/request_count"',
aggregation=monitoring_dashboard_v1.Aggregation(
alignment_period={'seconds': 60},
per_series_aligner=monitoring_dashboard_v1.Aggregation.Aligner.ALIGN_RATE
)
)
)
)
]
)
),
# Error rate widget
monitoring_dashboard_v1.Widget(
title="API Error Rate",
xy_chart=monitoring_dashboard_v1.XyChart(
data_sets=[
monitoring_dashboard_v1.XyChart.DataSet(
time_series_query=monitoring_dashboard_v1.TimeSeriesQuery(
time_series_filter=monitoring_dashboard_v1.TimeSeriesFilter(
filter='metric.type="serviceruntime.googleapis.com/api/request_count" AND metric.labels.response_code_class="5xx"'
)
)
)
]
)
),
# Latency widget
monitoring_dashboard_v1.Widget(
title="API Latency (P95)",
xy_chart=monitoring_dashboard_v1.XyChart(
data_sets=[
monitoring_dashboard_v1.XyChart.DataSet(
time_series_query=monitoring_dashboard_v1.TimeSeriesQuery(
time_series_filter=monitoring_dashboard_v1.TimeSeriesFilter(
filter='metric.type="serviceruntime.googleapis.com/api/request_latencies"'
)
)
)
]
)
),
# Quota usage widget
monitoring_dashboard_v1.Widget(
title="Quota Usage",
xy_chart=monitoring_dashboard_v1.XyChart(
data_sets=[
monitoring_dashboard_v1.XyChart.DataSet(
time_series_query=monitoring_dashboard_v1.TimeSeriesQuery(
time_series_filter=monitoring_dashboard_v1.TimeSeriesFilter(
filter='metric.type="serviceruntime.googleapis.com/quota/allocation/usage"'
)
)
)
]
)
),
]
)
)
parent = f"projects/{project_id}"
response = client.create_dashboard(parent=parent, dashboard=dashboard)
print(f"Dashboard created: {response.name}")
return response
# Usage
create_api_monitoring_dashboard("my-project-123")
2. BigQuery Analysis¶
-- Export logs to BigQuery for analysis
-- Enable log export: Logging → Log Router → Create Sink
-- Analyze API usage by service
SELECT
protopayload_auditlog.serviceName AS service,
COUNT(*) AS request_count,
COUNTIF(protopayload_auditlog.status.code != 0) AS error_count,
ROUND(COUNTIF(protopayload_auditlog.status.code != 0) / COUNT(*) * 100, 2) AS error_rate_percent
FROM `project.dataset.cloudaudit_googleapis_com_activity`
WHERE DATE(timestamp) = CURRENT_DATE()
GROUP BY service
ORDER BY request_count DESC;
-- Analyze API usage by user
SELECT
protopayload_auditlog.authenticationInfo.principalEmail AS user,
protopayload_auditlog.serviceName AS service,
COUNT(*) AS request_count
FROM `project.dataset.cloudaudit_googleapis_com_activity`
WHERE DATE(timestamp) >= DATE_SUB(CURRENT_DATE(), INTERVAL 7 DAY)
GROUP BY user, service
ORDER BY request_count DESC
LIMIT 20;
-- Analyze quota exceeded errors
SELECT
protopayload_auditlog.serviceName AS service,
protopayload_auditlog.methodName AS method,
COUNT(*) AS quota_exceeded_count
FROM `project.dataset.cloudaudit_googleapis_com_activity`
WHERE protopayload_auditlog.status.message LIKE '%quota%'
AND DATE(timestamp) >= DATE_SUB(CURRENT_DATE(), INTERVAL 30 DAY)
GROUP BY service, method
ORDER BY quota_exceeded_count DESC;
-- Analyze API latency
SELECT
protopayload_auditlog.serviceName AS service,
APPROX_QUANTILES(
TIMESTAMP_DIFF(
protopayload_auditlog.response.timestamp,
protopayload_auditlog.request.timestamp,
MILLISECOND
), 100
)[OFFSET(50)] AS p50_latency_ms,
APPROX_QUANTILES(
TIMESTAMP_DIFF(
protopayload_auditlog.response.timestamp,
protopayload_auditlog.request.timestamp,
MILLISECOND
), 100
)[OFFSET(95)] AS p95_latency_ms,
APPROX_QUANTILES(
TIMESTAMP_DIFF(
protopayload_auditlog.response.timestamp,
protopayload_auditlog.request.timestamp,
MILLISECOND
), 100
)[OFFSET(99)] AS p99_latency_ms
FROM `project.dataset.cloudaudit_googleapis_com_activity`
WHERE DATE(timestamp) = CURRENT_DATE()
GROUP BY service
ORDER BY p95_latency_ms DESC;
🔧 Troubleshooting¶
1. High Error Rates¶
# Identify error patterns
gcloud logging read '
protoPayload.status.code!=0
AND timestamp>="2026-03-04T00:00:00Z"
' --limit=100 --format=json | \
jq -r '.[] | "\(.protoPayload.status.code): \(.protoPayload.status.message)"' | \
sort | uniq -c | sort -rn
# Check specific error details
gcloud logging read '
protoPayload.status.code=7
' --limit=10 --format=json | \
jq '.[] | {
time: .timestamp,
user: .protoPayload.authenticationInfo.principalEmail,
service: .protoPayload.serviceName,
method: .protoPayload.methodName,
error: .protoPayload.status.message
}'
2. Performance Issues¶
# Identify slow API calls
gcloud logging read '
protoPayload.serviceName="compute.googleapis.com"
AND jsonPayload.latency > 1000
' --limit=50
# Analyze latency by method
gcloud monitoring time-series list \
--filter='
metric.type="serviceruntime.googleapis.com/api/request_latencies"
AND metric.labels.method=~".*"
' \
--format=json | \
jq -r '.[] | "\(.metric.labels.method): \(.points[0].value.distributionValue.mean)"'
3. Quota Issues¶
# Check current quota usage
gcloud compute project-info describe \
--project=PROJECT_ID \
--format="table(quotas.metric,quotas.limit,quotas.usage)"
# Find quota exceeded errors
gcloud logging read '
protoPayload.status.message=~"quota"
' --limit=50 --format=json | \
jq -r '.[] | {
time: .timestamp,
service: .protoPayload.serviceName,
method: .protoPayload.methodName,
error: .protoPayload.status.message
}'
📋 Monitoring Checklist¶
Setup¶
- [ ] Enable audit logging for all services
- [ ] Export logs to BigQuery
- [ ] Create monitoring dashboards
- [ ] Set up alert policies
- [ ] Configure notification channels
- [ ] Document monitoring procedures
Daily Monitoring¶
- [ ] Check error rates
- [ ] Review quota usage
- [ ] Monitor latency metrics
- [ ] Check for alerts
- [ ] Review unusual patterns
Weekly Reviews¶
- [ ] Analyze API usage trends
- [ ] Review cost implications
- [ ] Check for optimization opportunities
- [ ] Update dashboards as needed
- [ ] Review and tune alerts
Monthly Analysis¶
- [ ] Comprehensive usage analysis
- [ ] Cost optimization review
- [ ] Quota planning
- [ ] Performance optimization
- [ ] Documentation updates
✅ Best Practices¶
Monitoring¶
- [ ] Monitor all critical APIs
- [ ] Set up proactive alerts
- [ ] Track both usage and performance
- [ ] Regular dashboard reviews
- [ ] Document baseline metrics
Logging¶
- [ ] Enable comprehensive audit logs
- [ ] Export logs for long-term analysis
- [ ] Use structured logging
- [ ] Implement log retention policies
- [ ] Regular log analysis
Alerting¶
- [ ] Alert on error rate thresholds
- [ ] Alert on quota usage (80%+)
- [ ] Alert on latency degradation
- [ ] Use appropriate notification channels
- [ ] Test alert policies regularly
Optimization¶
- [ ] Regular performance reviews
- [ ] Identify and fix bottlenecks
- [ ] Optimize API usage patterns
- [ ] Implement caching where appropriate
- [ ] Monitor cost implications
🎓 Summary¶
API monitoring is essential for: - Ensuring reliability and performance - Proactive issue detection - Cost optimization - Capacity planning - Compliance and auditing
Key takeaways: 1. Monitor request counts, errors, and latency 2. Set up proactive alerts 3. Use dashboards for visualization 4. Export logs to BigQuery for analysis 5. Regular reviews and optimization
Last Updated: March 2026 Version: 2.0