You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							352 lines
						
					
					
						
							8.8 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							352 lines
						
					
					
						
							8.8 KiB
						
					
					
				
								#!/bin/bash
							 | 
						|
								
							 | 
						|
								# Setup monitoring for Kafka Client Load Test
							 | 
						|
								# This script sets up Prometheus and Grafana configurations
							 | 
						|
								
							 | 
						|
								set -euo pipefail
							 | 
						|
								
							 | 
						|
								SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
							 | 
						|
								PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
							 | 
						|
								MONITORING_DIR="$PROJECT_DIR/monitoring"
							 | 
						|
								
							 | 
						|
								# Colors
							 | 
						|
								GREEN='\033[0;32m'
							 | 
						|
								BLUE='\033[0;34m'
							 | 
						|
								NC='\033[0m'
							 | 
						|
								
							 | 
						|
								log_info() {
							 | 
						|
								    echo -e "${BLUE}[INFO]${NC} $1"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								log_success() {
							 | 
						|
								    echo -e "${GREEN}[SUCCESS]${NC} $1"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Create monitoring directory structure
							 | 
						|
								setup_directories() {
							 | 
						|
								    log_info "Setting up monitoring directories..."
							 | 
						|
								    
							 | 
						|
								    mkdir -p "$MONITORING_DIR/prometheus"
							 | 
						|
								    mkdir -p "$MONITORING_DIR/grafana/dashboards"
							 | 
						|
								    mkdir -p "$MONITORING_DIR/grafana/provisioning/dashboards"
							 | 
						|
								    mkdir -p "$MONITORING_DIR/grafana/provisioning/datasources"
							 | 
						|
								    
							 | 
						|
								    log_success "Directories created"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Create Prometheus configuration
							 | 
						|
								create_prometheus_config() {
							 | 
						|
								    log_info "Creating Prometheus configuration..."
							 | 
						|
								    
							 | 
						|
								    cat > "$MONITORING_DIR/prometheus/prometheus.yml" << 'EOF'
							 | 
						|
								# Prometheus configuration for Kafka Load Test monitoring
							 | 
						|
								
							 | 
						|
								global:
							 | 
						|
								  scrape_interval: 15s
							 | 
						|
								  evaluation_interval: 15s
							 | 
						|
								
							 | 
						|
								rule_files:
							 | 
						|
								  # - "first_rules.yml"
							 | 
						|
								  # - "second_rules.yml"
							 | 
						|
								
							 | 
						|
								scrape_configs:
							 | 
						|
								  # Scrape Prometheus itself
							 | 
						|
								  - job_name: 'prometheus'
							 | 
						|
								    static_configs:
							 | 
						|
								      - targets: ['localhost:9090']
							 | 
						|
								
							 | 
						|
								  # Scrape load test metrics
							 | 
						|
								  - job_name: 'kafka-loadtest'
							 | 
						|
								    static_configs:
							 | 
						|
								      - targets: ['kafka-client-loadtest-runner:8080']
							 | 
						|
								    scrape_interval: 5s
							 | 
						|
								    metrics_path: '/metrics'
							 | 
						|
								
							 | 
						|
								  # Scrape SeaweedFS Master metrics
							 | 
						|
								  - job_name: 'seaweedfs-master'
							 | 
						|
								    static_configs:
							 | 
						|
								      - targets: ['seaweedfs-master:9333']
							 | 
						|
								    metrics_path: '/metrics'
							 | 
						|
								
							 | 
						|
								  # Scrape SeaweedFS Volume metrics  
							 | 
						|
								  - job_name: 'seaweedfs-volume'
							 | 
						|
								    static_configs:
							 | 
						|
								      - targets: ['seaweedfs-volume:8080']
							 | 
						|
								    metrics_path: '/metrics'
							 | 
						|
								
							 | 
						|
								  # Scrape SeaweedFS Filer metrics
							 | 
						|
								  - job_name: 'seaweedfs-filer'
							 | 
						|
								    static_configs:
							 | 
						|
								      - targets: ['seaweedfs-filer:8888']
							 | 
						|
								    metrics_path: '/metrics'
							 | 
						|
								
							 | 
						|
								  # Scrape SeaweedFS MQ Broker metrics (if available)
							 | 
						|
								  - job_name: 'seaweedfs-mq-broker'
							 | 
						|
								    static_configs:
							 | 
						|
								      - targets: ['seaweedfs-mq-broker:17777']
							 | 
						|
								    metrics_path: '/metrics'
							 | 
						|
								    scrape_interval: 10s
							 | 
						|
								
							 | 
						|
								  # Scrape Kafka Gateway metrics (if available)
							 | 
						|
								  - job_name: 'kafka-gateway'
							 | 
						|
								    static_configs:
							 | 
						|
								      - targets: ['kafka-gateway:9093']
							 | 
						|
								    metrics_path: '/metrics'
							 | 
						|
								    scrape_interval: 10s
							 | 
						|
								EOF
							 | 
						|
								
							 | 
						|
								    log_success "Prometheus configuration created"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Create Grafana datasource configuration
							 | 
						|
								create_grafana_datasource() {
							 | 
						|
								    log_info "Creating Grafana datasource configuration..."
							 | 
						|
								    
							 | 
						|
								    cat > "$MONITORING_DIR/grafana/provisioning/datasources/datasource.yml" << 'EOF'
							 | 
						|
								apiVersion: 1
							 | 
						|
								
							 | 
						|
								datasources:
							 | 
						|
								  - name: Prometheus
							 | 
						|
								    type: prometheus
							 | 
						|
								    access: proxy
							 | 
						|
								    orgId: 1
							 | 
						|
								    url: http://prometheus:9090
							 | 
						|
								    basicAuth: false
							 | 
						|
								    isDefault: true
							 | 
						|
								    editable: true
							 | 
						|
								    version: 1
							 | 
						|
								EOF
							 | 
						|
								
							 | 
						|
								    log_success "Grafana datasource configuration created"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Create Grafana dashboard provisioning
							 | 
						|
								create_grafana_dashboard_provisioning() {
							 | 
						|
								    log_info "Creating Grafana dashboard provisioning..."
							 | 
						|
								    
							 | 
						|
								    cat > "$MONITORING_DIR/grafana/provisioning/dashboards/dashboard.yml" << 'EOF'
							 | 
						|
								apiVersion: 1
							 | 
						|
								
							 | 
						|
								providers:
							 | 
						|
								  - name: 'default'
							 | 
						|
								    orgId: 1
							 | 
						|
								    folder: ''
							 | 
						|
								    type: file
							 | 
						|
								    disableDeletion: false
							 | 
						|
								    editable: true
							 | 
						|
								    options:
							 | 
						|
								      path: /var/lib/grafana/dashboards
							 | 
						|
								EOF
							 | 
						|
								
							 | 
						|
								    log_success "Grafana dashboard provisioning created"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Create Kafka Load Test dashboard
							 | 
						|
								create_loadtest_dashboard() {
							 | 
						|
								    log_info "Creating Kafka Load Test Grafana dashboard..."
							 | 
						|
								    
							 | 
						|
								    cat > "$MONITORING_DIR/grafana/dashboards/kafka-loadtest.json" << 'EOF'
							 | 
						|
								{
							 | 
						|
								  "dashboard": {
							 | 
						|
								    "id": null,
							 | 
						|
								    "title": "Kafka Client Load Test Dashboard",
							 | 
						|
								    "tags": ["kafka", "loadtest", "seaweedfs"],
							 | 
						|
								    "timezone": "browser",
							 | 
						|
								    "panels": [
							 | 
						|
								      {
							 | 
						|
								        "id": 1,
							 | 
						|
								        "title": "Messages Produced/Consumed",
							 | 
						|
								        "type": "stat",
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "rate(kafka_loadtest_messages_produced_total[5m])",
							 | 
						|
								            "legendFormat": "Produced/sec"
							 | 
						|
								          },
							 | 
						|
								          {
							 | 
						|
								            "expr": "rate(kafka_loadtest_messages_consumed_total[5m])",
							 | 
						|
								            "legendFormat": "Consumed/sec"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 8, "w": 12, "x": 0, "y": 0}
							 | 
						|
								      },
							 | 
						|
								      {
							 | 
						|
								        "id": 2,
							 | 
						|
								        "title": "Message Latency",
							 | 
						|
								        "type": "graph",
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "histogram_quantile(0.95, kafka_loadtest_message_latency_seconds)",
							 | 
						|
								            "legendFormat": "95th percentile"
							 | 
						|
								          },
							 | 
						|
								          {
							 | 
						|
								            "expr": "histogram_quantile(0.99, kafka_loadtest_message_latency_seconds)",
							 | 
						|
								            "legendFormat": "99th percentile"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 8, "w": 12, "x": 12, "y": 0}
							 | 
						|
								      },
							 | 
						|
								      {
							 | 
						|
								        "id": 3,
							 | 
						|
								        "title": "Error Rates",
							 | 
						|
								        "type": "graph",
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "rate(kafka_loadtest_producer_errors_total[5m])",
							 | 
						|
								            "legendFormat": "Producer Errors/sec"
							 | 
						|
								          },
							 | 
						|
								          {
							 | 
						|
								            "expr": "rate(kafka_loadtest_consumer_errors_total[5m])",
							 | 
						|
								            "legendFormat": "Consumer Errors/sec"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 8, "w": 24, "x": 0, "y": 8}
							 | 
						|
								      },
							 | 
						|
								      {
							 | 
						|
								        "id": 4,
							 | 
						|
								        "title": "Throughput (MB/s)",
							 | 
						|
								        "type": "graph", 
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "rate(kafka_loadtest_bytes_produced_total[5m]) / 1024 / 1024",
							 | 
						|
								            "legendFormat": "Produced MB/s"
							 | 
						|
								          },
							 | 
						|
								          {
							 | 
						|
								            "expr": "rate(kafka_loadtest_bytes_consumed_total[5m]) / 1024 / 1024", 
							 | 
						|
								            "legendFormat": "Consumed MB/s"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 8, "w": 12, "x": 0, "y": 16}
							 | 
						|
								      },
							 | 
						|
								      {
							 | 
						|
								        "id": 5,
							 | 
						|
								        "title": "Active Clients",
							 | 
						|
								        "type": "stat",
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "kafka_loadtest_active_producers",
							 | 
						|
								            "legendFormat": "Producers"
							 | 
						|
								          },
							 | 
						|
								          {
							 | 
						|
								            "expr": "kafka_loadtest_active_consumers", 
							 | 
						|
								            "legendFormat": "Consumers"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 8, "w": 12, "x": 12, "y": 16}
							 | 
						|
								      },
							 | 
						|
								      {
							 | 
						|
								        "id": 6,
							 | 
						|
								        "title": "Consumer Lag",
							 | 
						|
								        "type": "graph",
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "kafka_loadtest_consumer_lag_messages",
							 | 
						|
								            "legendFormat": "{{consumer_group}}-{{topic}}-{{partition}}"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 8, "w": 24, "x": 0, "y": 24}
							 | 
						|
								      }
							 | 
						|
								    ],
							 | 
						|
								    "time": {"from": "now-30m", "to": "now"},
							 | 
						|
								    "refresh": "5s",
							 | 
						|
								    "schemaVersion": 16,
							 | 
						|
								    "version": 0
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								EOF
							 | 
						|
								
							 | 
						|
								    log_success "Kafka Load Test dashboard created"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Create SeaweedFS dashboard
							 | 
						|
								create_seaweedfs_dashboard() {
							 | 
						|
								    log_info "Creating SeaweedFS Grafana dashboard..."
							 | 
						|
								    
							 | 
						|
								    cat > "$MONITORING_DIR/grafana/dashboards/seaweedfs.json" << 'EOF'
							 | 
						|
								{
							 | 
						|
								  "dashboard": {
							 | 
						|
								    "id": null,
							 | 
						|
								    "title": "SeaweedFS Cluster Dashboard",
							 | 
						|
								    "tags": ["seaweedfs", "storage"],
							 | 
						|
								    "timezone": "browser", 
							 | 
						|
								    "panels": [
							 | 
						|
								      {
							 | 
						|
								        "id": 1,
							 | 
						|
								        "title": "Master Status",
							 | 
						|
								        "type": "stat",
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "up{job=\"seaweedfs-master\"}",
							 | 
						|
								            "legendFormat": "Master Up"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 4, "w": 6, "x": 0, "y": 0}
							 | 
						|
								      },
							 | 
						|
								      {
							 | 
						|
								        "id": 2, 
							 | 
						|
								        "title": "Volume Status",
							 | 
						|
								        "type": "stat",
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "up{job=\"seaweedfs-volume\"}",
							 | 
						|
								            "legendFormat": "Volume Up"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 4, "w": 6, "x": 6, "y": 0}
							 | 
						|
								      },
							 | 
						|
								      {
							 | 
						|
								        "id": 3,
							 | 
						|
								        "title": "Filer Status", 
							 | 
						|
								        "type": "stat",
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "up{job=\"seaweedfs-filer\"}",
							 | 
						|
								            "legendFormat": "Filer Up"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 4, "w": 6, "x": 12, "y": 0}
							 | 
						|
								      },
							 | 
						|
								      {
							 | 
						|
								        "id": 4,
							 | 
						|
								        "title": "MQ Broker Status",
							 | 
						|
								        "type": "stat", 
							 | 
						|
								        "targets": [
							 | 
						|
								          {
							 | 
						|
								            "expr": "up{job=\"seaweedfs-mq-broker\"}",
							 | 
						|
								            "legendFormat": "MQ Broker Up"
							 | 
						|
								          }
							 | 
						|
								        ],
							 | 
						|
								        "gridPos": {"h": 4, "w": 6, "x": 18, "y": 0}
							 | 
						|
								      }
							 | 
						|
								    ],
							 | 
						|
								    "time": {"from": "now-30m", "to": "now"},
							 | 
						|
								    "refresh": "10s",
							 | 
						|
								    "schemaVersion": 16,
							 | 
						|
								    "version": 0
							 | 
						|
								  }
							 | 
						|
								}
							 | 
						|
								EOF
							 | 
						|
								
							 | 
						|
								    log_success "SeaweedFS dashboard created"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								# Main setup function
							 | 
						|
								main() {
							 | 
						|
								    log_info "Setting up monitoring for Kafka Client Load Test..."
							 | 
						|
								    
							 | 
						|
								    setup_directories
							 | 
						|
								    create_prometheus_config
							 | 
						|
								    create_grafana_datasource 
							 | 
						|
								    create_grafana_dashboard_provisioning
							 | 
						|
								    create_loadtest_dashboard
							 | 
						|
								    create_seaweedfs_dashboard
							 | 
						|
								    
							 | 
						|
								    log_success "Monitoring setup completed!"
							 | 
						|
								    log_info "You can now start the monitoring stack with:"
							 | 
						|
								    log_info "  ./scripts/run-loadtest.sh monitor"
							 | 
						|
								    log_info ""
							 | 
						|
								    log_info "After starting, access:"
							 | 
						|
								    log_info "  Prometheus: http://localhost:9090"
							 | 
						|
								    log_info "  Grafana:    http://localhost:3000 (admin/admin)"
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								main "$@"
							 |