#!/bin/bash set -e # Colors for output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${BLUE}๐Ÿš€ Playwright + Grafana Loki Integration Test${NC}" echo "==============================================" # Check if Docker is running if ! docker info > /dev/null 2>&1; then echo -e "${RED}โŒ Docker is not running. Please start Docker first.${NC}" exit 1 fi echo -e "\n${BLUE}๐Ÿ“ฆ Starting local Loki stack...${NC}" if [ -f "docker-compose.loki.yml" ]; then docker-compose -f docker-compose.loki.yml up -d else echo -e "${YELLOW}โš ๏ธ docker-compose.loki.yml not found. Creating basic Loki setup...${NC}" # Create temporary Loki config cat > /tmp/loki-config.yml << 'EOF' auth_enabled: false server: http_listen_port: 3100 ingester: lifecycler: address: 127.0.0.1 ring: kvstore: store: inmemory replication_factor: 1 chunk_idle_period: 3m chunk_retain_period: 1m schema_config: configs: - from: 2020-10-24 store: boltdb object_store: filesystem schema: v11 index: prefix: index_ period: 168h storage_config: boltdb: directory: /tmp/loki/index filesystem: directory: /tmp/loki/chunks limits_config: enforce_metric_name: false reject_old_samples: true reject_old_samples_max_age: 168h chunk_store_config: max_look_back_period: 0s table_manager: retention_deletes_enabled: false retention_period: 0s EOF # Start Loki container docker run -d \ --name loki-test \ -p 3100:3100 \ -v /tmp/loki-config.yml:/etc/loki/local-config.yaml \ grafana/loki:2.9.0 \ -config.file=/etc/loki/local-config.yaml # Start Grafana container docker run -d \ --name grafana-test \ -p 3000:3000 \ -e "GF_AUTH_ANONYMOUS_ENABLED=true" \ -e "GF_AUTH_ANONYMOUS_ORG_ROLE=Admin" \ grafana/grafana:10.1.0 fi # Wait for Loki to be ready echo -e "\n${YELLOW}โณ Waiting for Loki to start...${NC}" max_attempts=30 attempt=0 until curl -s http://localhost:3100/ready | grep -q "ready" || [ $attempt -eq $max_attempts ]; do sleep 2 attempt=$((attempt + 1)) echo -n "." done echo "" if [ $attempt -eq $max_attempts ]; then echo -e "${RED}โŒ Loki failed to start within 60 seconds${NC}" exit 1 fi echo -e "${GREEN}โœ… Loki is ready${NC}" # Export environment variables export GRAFANA_LOKI_URL="http://localhost:3100" export GRAFANA_LOKI_USERNAME="" export GRAFANA_LOKI_PASSWORD="" echo -e "\n${BLUE}๐Ÿงช Running a test Playwright test...${NC}" # Check if tests directory exists if [ -d "tests/e2e" ]; then npx playwright test tests/e2e/auth/login.spec.ts --project=chromium --reporter=./tests/helpers/loki-reporter.ts 2>&1 || true else echo -e "${YELLOW}โš ๏ธ No test files found. Skipping test execution.${NC}" fi # Wait a moment for logs to be ingested sleep 3 echo -e "\n${BLUE}๐Ÿ” Querying Loki for test logs...${NC}" start_time=$(date -u -d '5 minutes ago' +%s)000000000 end_time=$(date -u +%s)000000000 response=$(curl -s -G "http://localhost:3100/loki/api/v1/query_range" \ --data-urlencode 'query={job="playwright-tests"}' \ --data-urlencode "start=$start_time" \ --data-urlencode "end=$end_time") # Check if we got results result_count=$(echo "$response" | jq '.data.result | length') if [ "$result_count" -gt 0 ]; then echo -e "${GREEN}โœ… Found $result_count log streams in Loki${NC}" echo -e "\n${BLUE}Sample logs:${NC}" echo "$response" | jq -r '.data.result[0].values[0:3][] | .[1]' 2>/dev/null || echo "No log content available" else echo -e "${YELLOW}โš ๏ธ No logs found in Loki. This might be expected if no tests ran.${NC}" fi # Display useful queries echo -e "\n${BLUE}๐Ÿ“Š Useful LogQL Queries:${NC}" echo "------------------------------------" echo "All test logs:" echo ' {job="playwright-tests"}' echo "" echo "Failed tests only:" echo ' {job="playwright-tests", status="failed"}' echo "" echo "Tests by browser:" echo ' {job="playwright-tests", browser="chromium"}' echo "" echo "Test duration stats:" echo ' quantile_over_time(0.95, {job="playwright-tests"} | json | unwrap duration_ms [1h])' echo "" # Open Grafana echo -e "\n${GREEN}๐ŸŒ Grafana is available at: http://localhost:3000${NC}" echo -e "${BLUE} Default credentials: admin / admin${NC}" echo "" echo -e "${YELLOW}๐Ÿ“– To add Loki as a data source in Grafana:${NC}" echo " 1. Go to Configuration > Data Sources" echo " 2. Add Loki with URL: http://localhost:3100" echo " 3. Import the dashboard from: monitoring/grafana-dashboard.json" echo "" echo -e "${GREEN}โœ… Test complete!${NC}" echo "" echo -e "${BLUE}To stop the containers:${NC}" echo " docker stop loki-test grafana-test" echo " docker rm loki-test grafana-test" echo "" echo -e "${BLUE}To view logs in real-time:${NC}" echo " docker logs -f loki-test"