Production-ready monitoring solution for OCI Container Instances with sidecar-based Prometheus metrics collection, log forwarding, and automatic Management Agent registration.
This demo provides comprehensive container monitoring using a modern sidecar architecture:
- π Sidecar-Based Monitoring: Management Agent, Prometheus, and Log Forwarder run as sidecar containers
- π Automatic Registration: Management Agent auto-registers with your OCI tenancy
- π Log Forwarding: Automatic log collection and forwarding to OCI Logging
- π Network Security: NSG with automatic IP detection for secure access
- π¦ One-Command Deployment: Fully automated infrastructure provisioning
- π³ Multi-Exporter Support: cAdvisor, Node Exporter, and application-specific exporters
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β OCI Container Instance - 7 Containers β
β Public IP: YOURIP β
β β
β βββββββββββββββββββ ββββββββββββββββββββ ββββββββββββββββββββ β
β β Application β β Official Oracle β β Prometheus β β
β β Container β β Mgmt Agent β β Sidecar β β
β β + cAdvisor β β Sidecar v1.9.0 β β β β
β β + Node Export. β β β β - Aggregates β β
β β β β - Auto-registersββββ€ all metrics β β
β β - App :80 β β - ConfigFile β β - Scrapes :9090 β β
β β - Metrics :9090ββββ€ with input.rspβ β - Prometheus DB β β
β β - cAdvisor:8080β β - Resource β ββββββββββββββββββββ β
β β - Node Exp:9100β β Principal β β
β ββββββββββ¬βββββββββ β - Sends to OCI β ββββββββββββββββββββ β
β β β Monitoring β β Grafana β β
β β ββββββββββββββββββββ β Sidecar β β
β β β β β
β β ββββββββββββββββββββ β - Dashboards β β
β β β Log Forwarder β β - Prometheus DS β β
β ββββββββββββΊβ Sidecar β β - Port :3000 β β
β Writes logs β β β - admin/admin β β
β to /logs β - Monitors /logsββββΌββQueriesβββββββββ β
β β - Batch forward β β Prometheus β β
β β - OCI Logging β ββββββββββββββββββββ β
β ββββββββββββββββββββ β
β β
β Shared Volumes: β
β β’ /metrics - Shared for metrics exchange β
β β’ /logs - Shared for log collection β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β
βββββββββββ΄ββββββββββ
β β
βββββββΌβββββββ ββββββββΌββββββββ
βOCI β βOCI β
βMonitoring β βLogging β
β β β β
βNamespace: β βLog Group: β
βcontainer_ β βcontainer- β
βmonitoring β βinstance-logs β
βββββββββββββββ ββββββββββββββββ
This section demonstrates the complete monitoring stack in action, showing how all 7 containers work together to provide comprehensive observability.
Note: Screenshot image files should be placed in the
/screenshots/directory. See/screenshots/README.mdfor required files and naming conventions.
Important: Throughout this documentation,
YOURIPis used as a placeholder for your Container Instance's public IP address. Replace it with your actual deployment IP when accessing the services.
Grafana provides a powerful visualization interface for all collected metrics. The screenshot below shows the Metrics Explorer with container-level metrics:
What you see:
- Real-time container CPU and memory usage
- Network I/O metrics for all containers
- Custom application metrics from the application container
- Historical data visualizations with configurable time ranges
- Prometheus datasource pre-configured and connected
Access: http://YOURIP:3000 (Username: admin, Password: admin)
The main application webpage provides a comprehensive overview of the monitoring architecture:
What you see:
- Visual representation of the 7-container sidecar architecture
- Component health status indicators
- Links to access each monitoring component directly
- System information and deployment details
- Real-time health check status
Access: http://YOURIP/
Prometheus continuously scrapes metrics from all configured exporters. This view shows the health status of all scrape targets:
What you see:
- cAdvisor (localhost:8080) - Container metrics - Status: UP
- Node Exporter (localhost:9100) - Host system metrics - Status: UP
- Application Metrics (localhost:9090) - Custom app metrics - Status: UP
- Last scrape time and duration for each target
- Error indicators if any target is down
Access: http://YOURIP:9090/targets
cAdvisor provides detailed container-level metrics in Prometheus format. This shows the raw metrics output:
What you see:
container_cpu_usage_seconds_total- CPU usage per containercontainer_memory_usage_bytes- Current memory usagecontainer_network_receive_bytes_total- Network ingresscontainer_network_transmit_bytes_total- Network egresscontainer_fs_reads_bytes_total- Filesystem read operations- Labels for container identification (name, id, image)
Access: http://YOURIP:8080/metrics
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Complete Metrics & Logs Flow β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
1. APPLICATION CONTAINER
ββ Generates custom application metrics
ββ Writes logs to /logs/application.log
ββ Exposes health check endpoint
2. cAdVISOR (Port 8080)
ββ Monitors all 7 containers in the instance
ββ Collects CPU, memory, network, filesystem metrics
ββ Exposes metrics at :8080/metrics
3. NODE EXPORTER (Port 9100)
ββ Monitors host system (container instance)
ββ Collects CPU, memory, disk, network interface stats
ββ Exposes metrics at :9100/metrics
4. PROMETHEUS (Port 9090)
ββ Scrapes cAdvisor every 60s
ββ Scrapes Node Exporter every 60s
ββ Scrapes Application metrics every 60s
ββ Stores time-series data locally
ββ Provides query interface (PromQL)
ββ Exposes aggregated metrics at :9090/metrics
5. GRAFANA (Port 3000)
ββ Connects to Prometheus as datasource
ββ Queries metrics using PromQL
ββ Visualizes data in pre-configured dashboards
ββ Provides alerting capabilities
6. MANAGEMENT AGENT (Background)
ββ Scrapes Prometheus endpoint (:9090/metrics)
ββ Forwards metrics to OCI Monitoring service
ββ Sends to namespace: container_monitoring
ββ Enables viewing metrics in OCI Console
7. LOG FORWARDER (Background)
ββ Monitors /logs directory for new log entries
ββ Reads: application.log, prometheus.log, cadvisor.log
ββ Batches log entries (100 per batch)
ββ Forwards to OCI Logging using Resource Principal
After deployment, verify the integration:
# 1. Check all containers are ACTIVE
oci container-instances container list \
--container-instance-id <instance-id> \
--query 'data[*].{Name:"display-name",State:"lifecycle-state"}' \
--output table
# 2. Test Application
curl http://YOURIP/
curl http://YOURIP/health
# 3. Test Prometheus
curl http://YOURIP:9090/-/healthy
curl http://YOURIP:9090/api/v1/targets
# 4. Test cAdvisor
curl http://YOURIP:8080/metrics | grep container_cpu
# 5. Test Node Exporter
curl http://YOURIP:9100/metrics | grep node_cpu
# 6. Access Grafana
open http://YOURIP:3000
# Login: admin/admin
# 7. Verify OCI Monitoring (metrics should appear within 2-3 minutes)
oci monitoring metric list \
--compartment-id $COMPARTMENT_OCID \
--namespace container_monitoring
# 8. Verify OCI Logging
oci logging-search search-logs \
--search-query "search \"<log-group-ocid>\" | sort by datetime desc" \
--time-start "2025-01-01T00:00:00.000Z" \
--time-end "2025-12-31T23:59:59.999Z"- β Management Agent Auto-Registration: Automatically registers with OCI tenancy using install key
- β Sidecar-Based Collection: No agent installation needed on host
- β Prometheus Integration: Metrics collected via Prometheus protocol
- β
OCI Monitoring: Metrics appear in
container_monitoringnamespace - β Real-time Collection: 60-second default scrape interval (configurable)
- β Automatic Log Forwarding: Sidecar monitors and forwards logs to OCI Logging
- β
Shared Volume Pattern: Application writes to
/logs, forwarder reads and sends - β Batch Processing: Efficient batching with configurable size
- β Resource Principal Auth: Secure, credential-less authentication
- β Automatic IP Detection: NSG automatically configured with your public IP
- β Port-Based Rules: Secure access to all monitoring ports
- β Least Privilege: Only necessary ports exposed to your IP
- π Private Subnet Recommended: For production deployments, use private subnets without public IP assignment. Public IPs shown in examples are for testing only.
- Official Oracle Management Agent - v1.9.0 from Oracle Container Registry (no custom build needed)
- Prometheus Sidecar - Custom image: Aggregates metrics from all local exporters
- Application Container - Custom image: Sample nginx app with health endpoints
- Log Forwarder Sidecar - Custom image: Monitors /logs and forwards to OCI Logging
- Grafana - Official grafana/grafana:latest with auto-configured Prometheus datasource
- cAdvisor - Official google/cadvisor:latest for container metrics
- Node Exporter - Official prom/node-exporter:latest for host metrics
- Terraform >= 1.0.0
- OCI CLI configured with valid credentials
- Docker for building container images
- Git for cloning repository
- OCI tenancy with appropriate compartment
- VCN with subnet
- OCIR (Oracle Cloud Infrastructure Registry) access
- IAM permissions for:
- Container Instances
- Management Agents
- Monitoring
- Logging
- Networking (NSG creation)
The solution automatically creates necessary IAM policies and dynamic groups. Required root-level policies:
# Allow Container Instances to use OCI services
Allow dynamic-group <prefix>-container-instance-dg to manage all-resources in compartment <compartment>
# Allow Management Agent operations
Allow dynamic-group <prefix>-container-instance-dg to manage management-agents in compartment <compartment>
Allow dynamic-group <prefix>-container-instance-dg to use metrics in compartment <compartment>
# Allow log forwarding
Allow dynamic-group <prefix>-container-instance-dg to use log-content in compartment <compartment>git clone https://github.com/your-username/oci-container-monitoring-demo.git
cd oci-container-monitoring-demo# Copy example configuration
cp config/oci-monitoring.env.example config/oci-monitoring.env
# Edit configuration with your OCI details
vi config/oci-monitoring.envRequired Configuration:
# OCI Authentication
export OCI_REGION="eu-frankfurt-1"
export OCI_TENANCY_OCID="ocid1.tenancy.oc1..aaaa..."
export OCI_COMPARTMENT_OCID="ocid1.compartment.oc1..aaaa..."
# Networking
export VCN_OCID="ocid1.vcn.oc1..aaaa..."
export SUBNET_OCID="ocid1.subnet.oc1..aaaa..."
# OCIR Credentials (for pushing custom images)
export OCIR_USERNAME="<namespace>/<username>"
export OCIR_PASSWORD="<auth_token>"
# Container Configuration
export CONTAINER_INSTANCE_NAME="monitoring-demo"
# Sidecar Architecture (Enable all sidecars)
export ENABLE_SHARED_VOLUMES="true"
export ENABLE_MANAGEMENT_AGENT_SIDECAR="true"
export ENABLE_PROMETHEUS_SIDECAR="true"
export ENABLE_LOG_FORWARDER_SIDECAR="true"cd docker
./build-all.shWhat this does:
- Builds 4 container images:
- Management Agent Sidecar
- Prometheus Sidecar
- Application with Metrics
- Log Forwarder Sidecar
- Pushes images to OCIR
- Automatically updates
config/oci-monitoring.envwith image URLs
Output:
β Configuration file updated successfully!
Updated image URLs:
MGMT_AGENT_SIDECAR_IMAGE="fra.ocir.io/.../mgmt-agent-sidecar:1.0.0"
PROMETHEUS_SIDECAR_IMAGE="fra.ocir.io/.../prometheus-sidecar:1.0.0"
APP_WITH_METRICS_IMAGE="fra.ocir.io/.../app-with-metrics:1.0.0"
LOG_FORWARDER_SIDECAR_IMAGE="fra.ocir.io/.../log-forwarder-sidecar:1.0.0"
cd ..
./scripts/deploy.sh deployDeployment includes:
- β IAM policies and dynamic groups
- β Management Agent install key creation
- β NSG with automatic IP detection
- β Container Instance with all sidecars
- β OCI Logging log group and logs
- β Optional monitoring alarms
# List Management Agents in your compartment
oci management-agent agent list \
--compartment-id $OCI_COMPARTMENT_OCID \
--lifecycle-state ACTIVE \
--query 'data[*].{"Name":"display-name","State":"lifecycle-state","Host":"host"}' \
--output tableExpected Output:
+---------------------------------+---------+---------------------------+
| Name | State | Host |
+---------------------------------+---------+---------------------------+
| <hostname>-mgmt-agent | ACTIVE | monitoring-demo-app |
+---------------------------------+---------+---------------------------+
- Navigate to: Observability & Management β Monitoring β Metrics Explorer
- Select your compartment
- Choose namespace:
container_monitoring - Select metrics:
container_cpu_usage_seconds_totalcontainer_memory_usage_bytesapp_requests_total(custom metric)
- Navigate to: Observability & Management β Logging β Logs
- Find log group:
container-instance-logs - View logs:
- Application Log - Application stdout/stderr
- System Log - Container system logs
# Get container instance details
oci container-instances container-instance get \
--container-instance-id <instance-ocid> \
--query 'data.{"State":"lifecycle-state","Containers":"containers[*].{Name:display-name,State:lifecycle-state}"}' \
--output jsonExpected Output (7 Containers):
{
"State": "ACTIVE",
"Containers": [
{
"Name": "monitoring-demo-app",
"State": "ACTIVE"
},
{
"Name": "monitoring-demo-cadvisor",
"State": "ACTIVE"
},
{
"Name": "monitoring-demo-node-exporter",
"State": "ACTIVE"
},
{
"Name": "monitoring-demo-mgmt-agent-sidecar",
"State": "ACTIVE"
},
{
"Name": "monitoring-demo-prometheus-sidecar",
"State": "ACTIVE"
},
{
"Name": "monitoring-demo-log-forwarder-sidecar",
"State": "ACTIVE"
},
{
"Name": "monitoring-demo-grafana-sidecar",
"State": "ACTIVE"
}
]
}Grafana is pre-configured with Prometheus datasource and provides powerful visualization capabilities.
Access URL: http://YOURIP:3000
Default Credentials:
- Username:
admin - Password:
admin
What to verify:
- Login to Grafana at
http://YOURIP:3000 - Navigate to Explore β Metrics Explorer for ad-hoc queries
- Check Data Sources β Prometheus should be pre-configured pointing to
http://localhost:9090 - Query metrics using PromQL:
container_cpu_usage_seconds_total- Container CPU usagecontainer_memory_usage_bytes- Container memory usagerate(container_network_receive_bytes_total[5m])- Network ingress rate- Custom application metrics from your application container
- Create custom dashboards by importing or building from scratch
# Prometheus web UI
curl http://YOURIP:9090
# Or open in browser
open http://YOURIP:9090
# Query API example
curl 'http://YOURIP:9090/api/v1/query?query=up'# cAdvisor - Container metrics (detailed container statistics)
curl http://YOURIP:8080/metrics
# Node Exporter - Host metrics (system-level stats)
curl http://YOURIP:9100/metrics
# Application metrics (custom metrics from your app)
curl http://YOURIP/metrics1. Login to OCIR
2. Build Management Agent Sidecar
ββ Oracle Management Agent v1.9.0
ββ Configure auto-registration with Resource Principal
3. Build Prometheus Sidecar
ββ Prometheus server with scrape configuration
ββ Targets: cAdvisor, Node Exporter, Application
4. Build Application Container
ββ Nginx with health check endpoints
ββ Generates metrics for demonstration
5. Build Log Forwarder Sidecar
ββ Python app with OCI SDK
ββ Watches /logs directory and forwards to OCI Logging
6. Push all 4 custom images to OCIR
7. AUTO-UPDATE config/oci-monitoring.env
ββ Updates all image URLs automatically!
Note: Grafana, cAdvisor, and Node Exporter use official public images
1. Initialize Terraform
2. Detect Your Public IP (automatic)
ββ Uses https://ifconfig.me/ip
3. Create IAM Resources
ββ Dynamic Group for Container Instances
ββ Policies for Management Agent
ββ Policies for Monitoring
ββ Policies for Logging
4. Create NSG with Your IP
ββ HTTP/HTTPS: 80, 443
ββ Prometheus: 9090
ββ cAdvisor: 8080
ββ Node Exporter: 9100
ββ Optional exporters: 9104, 9113, 9115, 9121, 9187
5. Create Management Agent Install Key
6. Create Logging Resources
ββ Log Group
ββ Application Log
ββ System Log
7. Deploy Container Instance with 7 Containers
ββ Application Container (nginx)
ββ cAdvisor (container metrics)
ββ Node Exporter (host metrics)
ββ Management Agent Sidecar (forwards to OCI)
ββ Prometheus Sidecar (aggregates metrics)
ββ Log Forwarder Sidecar (forwards logs)
ββ Grafana (visualization)
8. Attach NSG to Container Instance
9. Configure Shared Volumes
ββ /metrics (Prometheus access)
ββ /logs (Log Forwarder access)
Application Container:
1. Starts nginx web server on port 80
2. Serves health check endpoint at /health
3. Generates sample metrics
4. Writes logs to /logs/application.log
cAdvisor Container:
1. Starts cAdvisor on port 8080
2. Monitors all 7 containers in the instance
3. Collects CPU, memory, network, filesystem metrics
4. Exposes metrics at :8080/metrics
Node Exporter Container:
1. Starts Node Exporter on port 9100
2. Monitors host system resources
3. Collects CPU, memory, disk, network interface stats
4. Exposes metrics at :9100/metrics
Prometheus Sidecar:
1. Loads prometheus.yml configuration
2. Scrapes cAdvisor (:8080/metrics) every 60s
3. Scrapes Node Exporter (:9100/metrics) every 60s
4. Scrapes Application metrics every 60s
5. Stores time-series data in local database
6. Provides query interface at :9090
7. Exposes aggregated metrics at :9090/metrics
Grafana Sidecar:
1. Starts Grafana on port 3000
2. Auto-configures Prometheus datasource (localhost:9090)
3. Installs default plugins
4. Ready for dashboard creation and metric visualization
5. Login: admin/admin
Management Agent Sidecar:
1. Downloads Management Agent RPM from OCI Object Storage
2. Extracts and installs agent using rpm2cpio
3. Creates response file with install key from environment
4. Runs setup.sh β REGISTERS WITH OCI
ββ Validates install key with OCI service
ββ Generates communication wallet
ββ Generates security artifacts
ββ Registers with Management Agent service
5. Configures Prometheus plugin (prometheusPluginConfig.json)
6. Starts agent (agentcore start)
7. Begins scraping Prometheus endpoint (:9090/metrics) every 60s
8. Forwards metrics to OCI Monitoring namespace: container_monitoring
Log Forwarder Sidecar:
1. Initializes OCI Logging client with Resource Principal
2. Monitors /logs directory using file watchers
3. Watches multiple log files: application.log, prometheus.log, etc.
4. Detects new log entries in real-time
5. Batches logs (100 entries per batch)
6. Forwards batches to OCI Logging using Resource Principal
7. Continues monitoring for new logs (no polling, event-driven)
Local Access (via Public IP: YOURIP):
1. Grafana Dashboard: http://YOURIP:3000
ββ Login: admin/admin
ββ Explore metrics using Metrics Explorer
ββ Create custom dashboards
ββ Query Prometheus datasource with PromQL
2. Prometheus UI: http://YOURIP:9090
ββ View targets health status
ββ Execute PromQL queries
ββ Graph metrics
3. cAdvisor: http://YOURIP:8080
ββ View detailed container metrics
4. Node Exporter: http://YOURIP:9100/metrics
ββ View host system metrics
5. Application: http://YOURIP/
ββ Health check: http://YOURIP/health
OCI Management Agent Console:
1. Navigate to: Observability & Management β Management Agents
2. Find agent: <hostname>-mgmt-agent
3. Status: ACTIVE
4. Plugin: Prometheus (Enabled)
OCI Monitoring Console:
1. Navigate to: Observability & Management β Monitoring β Metrics Explorer
2. Namespace: container_monitoring
3. View metrics (appear within 2-3 minutes after deployment):
ββ container_cpu_usage_seconds_total
ββ container_memory_usage_bytes
ββ container_network_receive_bytes_total
ββ container_network_transmit_bytes_total
ββ node_cpu_seconds_total
ββ node_memory_MemAvailable_bytes
ββ Custom application metrics (if configured)
OCI Logging Console:
1. Navigate to: Observability & Management β Logging β Logs
2. Log Group: container-instance-logs
3. Logs:
ββ Application Log (from /logs/application.log)
ββ Additional logs (prometheus, cadvisor, etc. if configured)
oci-container-monitoring-demo/
βββ config/
β βββ oci-monitoring.env # Main configuration (auto-updated by build-all.sh)
βββ docker/
β βββ build-all.sh # Builds all 4 images + AUTO-UPDATES .env
β βββ management-agent/
β β βββ Dockerfile
β β βββ entrypoint.sh # Agent registration & startup
β βββ prometheus/
β β βββ Dockerfile
β β βββ prometheus.yml
β βββ app-with-metrics/
β β βββ Dockerfile
β β βββ app.py # Sample app with /metrics
β βββ log-forwarder/
β βββ Dockerfile
β βββ log-forwarder.py # Monitors /logs and forwards to OCI
β βββ config.json.template
βββ terraform/
β βββ main.tf # Main config + NSG module
β βββ variables.tf
β βββ outputs.tf # Includes detected IP & NSG info
β βββ modules/
β βββ container-instance/ # Container Instance + sidecars
β βββ iam/ # Policies + dynamic groups
β βββ logging/ # OCI Logging resources
β βββ management-agent/ # Install key creation
β βββ nsg/ # Network Security Group
βββ scripts/
β βββ deploy.sh # Deployment orchestration
βββ README.md # This file
The Management Agent uses the Prometheus plugin to collect metrics and forward them to OCI Monitoring. This section explains how it's configured and how metrics flow from Prometheus to OCI.
Application Metrics (:9090/metrics)
β
Prometheus Sidecar (aggregates)
β
Management Agent (scrapes Prometheus)
β
OCI Monitoring (container_monitoring namespace)
The Management Agent Prometheus plugin is automatically configured using the ConfigFile volume with input.rsp:
# Automatically created by Terraform in ConfigFile volume
ManagementAgentInstallKey=${MGMT_AGENT_INSTALL_KEY}
AgentDisplayName=${CONTAINER_INSTANCE_NAME}-mgmt-agent
CredentialWalletPassword=${AUTO_GENERATED_PASSWORD}
Service.plugin.prometheus.download=true # Downloads Prometheus pluginThe plugin configuration is automatically created at agent startup:
Location: /opt/oracle/mgmt_agent/agent_inst/config/prometheus/prometheusPluginConfig.json
{
"entities": [
{
"namespace": "oci_prometheus_metrics",
"metricNamespace": "container_monitoring",
"resourceGroup": "monitoring-demo",
"prometheusConfig": {
"sourceUrl": "http://localhost:9090/metrics",
"scrapeInterval": "60s",
"scrapeTimeout": "10s"
}
}
]
}Step 1: Navigate to OCI Monitoring
- Go to Observability & Management β Monitoring β Metrics Explorer
- Select your compartment
- Choose namespace:
container_monitoring(NOToci_prometheus_metrics)
Step 2: Query Metrics Available metric families:
container_cpu_usage_seconds_total- CPU usage per containercontainer_memory_usage_bytes- Memory usage per containercontainer_network_receive_bytes_total- Network ingresscontainer_network_transmit_bytes_total- Network egressnode_cpu_seconds_total- Host CPU metricsnode_memory_MemAvailable_bytes- Host memory metrics- Custom application metrics (if exposed)
Step 3: Create Charts
- Use PromQL-like queries in OCI Metrics Explorer
- Set aggregation intervals (1m, 5m, 1h)
- Create alarms based on thresholds
Check Management Agent Status:
# List Management Agents
oci management-agent agent list \
--compartment-id $OCI_COMPARTMENT_OCID \
--lifecycle-state ACTIVE \
--query 'data[*].{"Name":"display-name","State":"lifecycle-state"}' \
--output tableCheck Prometheus Plugin:
# In Management Agent container logs, look for:
β Prometheus plugin configured
β Agent is now collecting and forwarding metrics to OCI MonitoringVerify Metrics Flow:
# Test Prometheus endpoint
curl http://YOURIP:9090/metrics
# Test specific metric query
curl 'http://YOURIP:9090/api/v1/query?query=container_memory_usage_bytes'
# Check OCI Monitoring for recent data points (metrics appear within 2-3 minutes)
oci monitoring metric list \
--compartment-id $OCI_COMPARTMENT_OCID \
--namespace container_monitoringTo modify scrape intervals or add additional scrape targets, update terraform.tfvars:
# Metrics Configuration
prometheus_scrape_interval = 60 # seconds
prometheus_scrape_timeout = 10 # seconds
metrics_namespace = "container_monitoring"Then re-apply terraform:
cd terraform
terraform apply -auto-approve# Enable sidecar pattern
export ENABLE_SHARED_VOLUMES="true"
# Management Agent Sidecar
export ENABLE_MANAGEMENT_AGENT_SIDECAR="true"
export MGMT_AGENT_SIDECAR_IMAGE="fra.ocir.io/.../mgmt-agent-sidecar:1.0.0"
export MGMT_AGENT_SIDECAR_MEMORY_GB="1.0"
export MGMT_AGENT_SIDECAR_OCPUS="0.25"
# Prometheus Sidecar
export ENABLE_PROMETHEUS_SIDECAR="true"
export PROMETHEUS_SIDECAR_IMAGE="fra.ocir.io/.../prometheus-sidecar:1.0.0"
export PROMETHEUS_SIDECAR_MEMORY_GB="1.0"
export PROMETHEUS_SIDECAR_OCPUS="0.25"
# Log Forwarder Sidecar
export ENABLE_LOG_FORWARDER_SIDECAR="true"
export LOG_FORWARDER_SIDECAR_IMAGE="fra.ocir.io/.../log-forwarder-sidecar:1.0.0"
export LOG_FORWARDER_SIDECAR_MEMORY_GB="0.5"
export LOG_FORWARDER_SIDECAR_OCPUS="0.125"# Base exporters (always recommended)
export ENABLE_PROMETHEUS_EXPORTERS="true" # cAdvisor + Node Exporter
# Application-specific exporters (optional)
export ENABLE_NGINX_EXPORTER="false" # Nginx metrics
export ENABLE_REDIS_EXPORTER="false" # Redis metrics
export ENABLE_POSTGRES_EXPORTER="false" # PostgreSQL metrics
export ENABLE_MYSQL_EXPORTER="false" # MySQL metrics
export ENABLE_BLACKBOX_EXPORTER="false" # Endpoint probingexport PROMETHEUS_SCRAPE_INTERVAL="60" # Seconds between scrapes
export PROMETHEUS_SCRAPE_TIMEOUT="10" # Scrape timeout
export PROMETHEUS_METRICS_PORT="9090" # Metrics endpoint port
export PROMETHEUS_METRICS_PATH="/metrics" # Metrics endpoint path
export METRICS_NAMESPACE="container_monitoring" # OCI Monitoring namespaceexport ENABLE_LOGGING="true" # Enable OCI Logging
export LOG_GROUP_NAME="container-instance-logs"
export LOG_RETENTION_DAYS="30"
export ENABLE_AUDIT_LOGS="true"Check container logs:
oci container-instances container list \
--container-instance-id <instance-id> \
--query 'data[?contains("display-name", `mgmt-agent`)].id' \
--raw-output | head -1 | xargs -I {} \
oci container-instances container retrieve-logs \
--container-id {}Common issues:
- Install key expired - Create new install key
- IAM policies missing - Verify dynamic group and policies
- Network connectivity - Check NSG and subnet route tables
- Agent already registered - Agent persists in volume, container restart uses existing registration
Verify Management Agent status:
# In Management Agent sidecar container logs, look for:
β Management Agent registered successfully with OCI
β Management Agent started successfully
β Agent is now collecting and forwarding metricsCheck Prometheus endpoint:
# From within container instance:
curl http://localhost:9090/metricsVerify namespace:
- Metrics appear in namespace:
container_monitoring - NOT in
oci_prometheus_metrics(that's the plugin namespace)
Check Log Forwarder status:
# View log forwarder container logs
oci container-instances container list \
--container-instance-id <instance-id> \
--query 'data[?contains("display-name", `log-forwarder`)].id' \
--raw-output | head -1 | xargs -I {} \
oci container-instances container retrieve-logs \
--container-id {}Verify log OCID:
# Check that LOG_OCID environment variable is set in log forwarder
# It should match the application_log_ocid from logging moduleCheck your current IP:
curl https://ifconfig.me/ipVerify NSG rules:
oci network nsg-security-rule list \
--network-security-group-id <nsg-id> \
--query 'data[*].{"Direction":"direction","Source":"source","Port":"tcp-options.destination-port-range"}' \
--output tableUpdate NSG if IP changed:
# Re-run terraform to update NSG with new IP
cd terraform
terraform apply -auto-approve- Use appropriate scrape intervals: Balance between data resolution and resource usage
- Configure retention: Set appropriate retention in OCI Monitoring
- Use labels effectively: Leverage container, instance, and custom labels
- Set retention policies: Configure log retention based on compliance needs
- Use log levels: Structure logs with severity levels (INFO, WARN, ERROR)
- Monitor log volume: Watch for unusual log volume spikes
- Sidecar sizing: Allocate appropriate CPU/memory to sidecars
- Monitor sidecar health: Check sidecar container status regularly
- Scale appropriately: Increase resources if sidecars are CPU/memory constrained
- Rotate install keys: Periodically rotate Management Agent install keys
- Review IAM policies: Ensure least privilege access
- Monitor NSG rules: Keep allowed IP addresses up to date
- Use Resource Principal: Avoid hardcoded credentials
Add custom metrics to your application:
from prometheus_client import Counter, Histogram, generate_latest
# Define metrics
request_count = Counter('app_requests_total', 'Total requests', ['method', 'endpoint'])
request_duration = Histogram('app_request_duration_seconds', 'Request duration')
# Instrument your code
@request_duration.time()
def handle_request():
request_count.labels(method='GET', endpoint='/api').inc()
# Your code here
# Expose metrics endpoint
@app.route('/metrics')
def metrics():
return generate_latest()Scale container instances:
# In config/oci-monitoring.env
export CONTAINER_COUNT="3" # Deploy 3 replicasCreate custom Grafana dashboards by importing JSON from OCI Monitoring:
- Export metrics from OCI Monitoring
- Convert to Grafana format
- Import into Grafana instance
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
This project is licensed under the MIT License - see LICENSE file for details.
For issues and questions:
- Open an issue on GitHub: https://github.com/your-username/oci-container-monitoring-demo/issues
- Check OCI documentation
- Review troubleshooting section above
Completed:
- Grafana deployment - Now included with pre-configured Prometheus datasource
- Official Oracle Management Agent - Using v1.9.0 from Oracle Container Registry
- Automated registration - ConfigFile volume with Resource Principal authentication
Future enhancements planned:
- Multi-region deployment
- Alert manager integration
- Additional custom metric dashboards
- Automated backup/restore
- HA configuration examples
- Log forwarder improvements (OCI Logging integration optimization)
- β Official Oracle Management Agent v1.9.0 - No custom builds required
- β Grafana Sidecar - Pre-configured with Prometheus datasource for powerful visualization
- β 7 Container Architecture - App, cAdvisor, Node Exporter, Mgmt Agent, Prometheus, Log Forwarder, Grafana
- β ConfigFile Volume - Automatic agent registration with input.rsp
- β Resource Principal Auth - No hardcoded credentials for secure authentication
- β Complete Observability Stack - Metrics, logs, and visualization in one deployment
- β Production Deployment - Currently running at YOURIP with all 7 containers ACTIVE
- β Enhanced Documentation - Screenshots and detailed component integration documentation
Current Deployment Status:
- Public IP: YOURIP
- All 7 containers: ACTIVE and healthy
- Grafana: Accessible at :3000 (admin/admin)
- Prometheus: Collecting metrics from all exporters
- Log Forwarder: Successfully forwarding to OCI Logging
- Management Agent: Registered and sending metrics to OCI Monitoring
- β Sidecar-based architecture for all components
- β Custom Management Agent builds (deprecated in v2.0.0)
- β Log forwarding with OCI Logging integration
- β NSG with automatic IP detection
- β Complete Terraform automation
Built with β€οΈ for OCI Container Instances



