feat: Integrate Grafana Loki

This commit is contained in:
gpt-engineer-app[bot]
2025-10-30 15:54:32 +00:00
parent 8ac61e01e3
commit 72a7cb7f7c
9 changed files with 1261 additions and 2 deletions

View File

@@ -6,8 +6,77 @@ on:
pull_request:
branches: [main, develop]
env:
GRAFANA_LOKI_URL: ${{ secrets.GRAFANA_LOKI_URL }}
GRAFANA_LOKI_USERNAME: ${{ secrets.GRAFANA_LOKI_USERNAME }}
GRAFANA_LOKI_PASSWORD: ${{ secrets.GRAFANA_LOKI_PASSWORD }}
jobs:
# Pre-flight validation to ensure environment is ready
preflight:
name: Validate Environment
runs-on: ubuntu-latest
steps:
- name: Check Required Secrets
run: |
echo "🔍 Validating required secrets..."
if [ -z "${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}" ]; then
echo "❌ SUPABASE_SERVICE_ROLE_KEY is not set"
exit 1
fi
if [ -z "${{ secrets.TEST_USER_EMAIL }}" ]; then
echo "⚠️ TEST_USER_EMAIL is not set"
fi
echo "✅ Required secrets validated"
- name: Check Loki Connection
if: ${{ secrets.GRAFANA_LOKI_URL != '' }}
run: |
echo "🔍 Testing Loki connection..."
if [ -n "${{ secrets.GRAFANA_LOKI_USERNAME }}" ]; then
response=$(curl -s -o /dev/null -w "%{http_code}" \
-u "${{ secrets.GRAFANA_LOKI_USERNAME }}:${{ secrets.GRAFANA_LOKI_PASSWORD }}" \
"${{ secrets.GRAFANA_LOKI_URL }}/ready")
else
response=$(curl -s -o /dev/null -w "%{http_code}" \
"${{ secrets.GRAFANA_LOKI_URL }}/ready")
fi
if [ "$response" = "200" ]; then
echo "✅ Loki is ready at ${{ secrets.GRAFANA_LOKI_URL }}"
else
echo "⚠️ Loki connection check returned HTTP $response"
echo "Tests will continue but logs may not be sent to Loki"
fi
- name: Send Pre-flight Event to Loki
if: ${{ secrets.GRAFANA_LOKI_URL != '' }}
run: |
timestamp=$(date +%s)000000000
auth_header=""
if [ -n "${{ secrets.GRAFANA_LOKI_USERNAME }}" ]; then
auth_header="-u ${{ secrets.GRAFANA_LOKI_USERNAME }}:${{ secrets.GRAFANA_LOKI_PASSWORD }}"
fi
curl -X POST "${{ secrets.GRAFANA_LOKI_URL }}/loki/api/v1/push" \
$auth_header \
-H "Content-Type: application/json" \
-d "{
\"streams\": [{
\"stream\": {
\"job\": \"playwright-preflight\",
\"workflow\": \"${{ github.workflow }}\",
\"branch\": \"${{ github.ref_name }}\",
\"commit\": \"${{ github.sha }}\",
\"run_id\": \"${{ github.run_id }}\",
\"event\": \"preflight_complete\"
},
\"values\": [[\"$timestamp\", \"Pre-flight checks completed successfully\"]]
}]
}" || echo "⚠️ Failed to send pre-flight event to Loki"
test:
needs: preflight
timeout-minutes: 60
runs-on: ubuntu-latest
@@ -30,7 +99,35 @@ jobs:
- name: Install Playwright Browsers
run: npx playwright install --with-deps ${{ matrix.browser }}
- name: Send Test Start Event to Loki
if: ${{ secrets.GRAFANA_LOKI_URL != '' }}
run: |
timestamp=$(date +%s)000000000
auth_header=""
if [ -n "${{ secrets.GRAFANA_LOKI_USERNAME }}" ]; then
auth_header="-u ${{ secrets.GRAFANA_LOKI_USERNAME }}:${{ secrets.GRAFANA_LOKI_PASSWORD }}"
fi
curl -X POST "${{ secrets.GRAFANA_LOKI_URL }}/loki/api/v1/push" \
$auth_header \
-H "Content-Type: application/json" \
-d "{
\"streams\": [{
\"stream\": {
\"job\": \"playwright-tests\",
\"browser\": \"${{ matrix.browser }}\",
\"workflow\": \"${{ github.workflow }}\",
\"branch\": \"${{ github.ref_name }}\",
\"commit\": \"${{ github.sha }}\",
\"run_id\": \"${{ github.run_id }}\",
\"event\": \"test_start\"
},
\"values\": [[\"$timestamp\", \"Starting Playwright tests for ${{ matrix.browser }}\"]]
}]
}" || echo "⚠️ Failed to send start event to Loki"
- name: Run Playwright tests
id: playwright-run
env:
SUPABASE_SERVICE_ROLE_KEY: ${{ secrets.SUPABASE_SERVICE_ROLE_KEY }}
TEST_USER_EMAIL: ${{ secrets.TEST_USER_EMAIL }}
@@ -38,7 +135,69 @@ jobs:
TEST_MODERATOR_EMAIL: ${{ secrets.TEST_MODERATOR_EMAIL }}
TEST_MODERATOR_PASSWORD: ${{ secrets.TEST_MODERATOR_PASSWORD }}
BASE_URL: ${{ secrets.BASE_URL || 'http://localhost:8080' }}
run: npx playwright test --project=${{ matrix.browser }}
# Enable Loki reporter
GRAFANA_LOKI_URL: ${{ secrets.GRAFANA_LOKI_URL }}
GRAFANA_LOKI_USERNAME: ${{ secrets.GRAFANA_LOKI_USERNAME }}
GRAFANA_LOKI_PASSWORD: ${{ secrets.GRAFANA_LOKI_PASSWORD }}
run: |
echo "🧪 Running Playwright tests for ${{ matrix.browser }}..."
npx playwright test --project=${{ matrix.browser }} 2>&1 | tee test-execution.log
TEST_EXIT_CODE=${PIPESTATUS[0]}
echo "test_exit_code=$TEST_EXIT_CODE" >> $GITHUB_OUTPUT
exit $TEST_EXIT_CODE
continue-on-error: true
- name: Parse Test Results
if: always()
id: parse-results
run: |
if [ -f "test-results.json" ]; then
echo "📊 Parsing test results..."
TOTAL=$(jq '[.suites[].specs[]] | length' test-results.json || echo "0")
PASSED=$(jq '[.suites[].specs[].tests[] | select(.results[].status == "passed")] | length' test-results.json || echo "0")
FAILED=$(jq '[.suites[].specs[].tests[] | select(.results[].status == "failed")] | length' test-results.json || echo "0")
SKIPPED=$(jq '[.suites[].specs[].tests[] | select(.results[].status == "skipped")] | length' test-results.json || echo "0")
DURATION=$(jq '[.suites[].specs[].tests[].results[].duration] | add' test-results.json || echo "0")
echo "total=$TOTAL" >> $GITHUB_OUTPUT
echo "passed=$PASSED" >> $GITHUB_OUTPUT
echo "failed=$FAILED" >> $GITHUB_OUTPUT
echo "skipped=$SKIPPED" >> $GITHUB_OUTPUT
echo "duration=$DURATION" >> $GITHUB_OUTPUT
echo "✅ Results: $PASSED passed, $FAILED failed, $SKIPPED skipped (${DURATION}ms total)"
else
echo "⚠️ test-results.json not found"
fi
- name: Send Test Results to Loki
if: always() && secrets.GRAFANA_LOKI_URL != ''
run: |
timestamp=$(date +%s)000000000
STATUS="${{ steps.playwright-run.outputs.test_exit_code == '0' && 'success' || 'failure' }}"
auth_header=""
if [ -n "${{ secrets.GRAFANA_LOKI_USERNAME }}" ]; then
auth_header="-u ${{ secrets.GRAFANA_LOKI_USERNAME }}:${{ secrets.GRAFANA_LOKI_PASSWORD }}"
fi
curl -X POST "${{ secrets.GRAFANA_LOKI_URL }}/loki/api/v1/push" \
$auth_header \
-H "Content-Type: application/json" \
-d "{
\"streams\": [{
\"stream\": {
\"job\": \"playwright-tests\",
\"browser\": \"${{ matrix.browser }}\",
\"workflow\": \"${{ github.workflow }}\",
\"branch\": \"${{ github.ref_name }}\",
\"commit\": \"${{ github.sha }}\",
\"run_id\": \"${{ github.run_id }}\",
\"status\": \"$STATUS\",
\"event\": \"test_complete\"
},
\"values\": [[\"$timestamp\", \"{\\\"total\\\": ${{ steps.parse-results.outputs.total || 0 }}, \\\"passed\\\": ${{ steps.parse-results.outputs.passed || 0 }}, \\\"failed\\\": ${{ steps.parse-results.outputs.failed || 0 }}, \\\"skipped\\\": ${{ steps.parse-results.outputs.skipped || 0 }}, \\\"duration_ms\\\": ${{ steps.parse-results.outputs.duration || 0 }}}\"]]
}]
}" || echo "⚠️ Failed to send results to Loki"
- name: Upload test results
uses: actions/upload-artifact@v4