Events¶
Polycrate erzeugt für jede ausgeführte Action eine Transaction und ein Event. Das Logging von Workspace Transactions ist standardmäßig deaktiviert.
Event-System Architektur¶
sequenceDiagram
participant User
participant CLI as Polycrate CLI
participant Container
participant Handler as Event Handler
participant Webhook
participant LogFile as Log Directory
User->>CLI: polycrate run myblock install
CLI->>CLI: Generiere Transaction-ID
CLI->>CLI: Erstelle Snapshot
CLI->>Container: Führe Action aus
alt Action erfolgreich
Container-->>CLI: Exit 0
CLI->>Handler: Event: success
else Action fehlgeschlagen
Container-->>CLI: Exit 1
CLI->>Handler: Event: failure
end
alt workspace Handler konfiguriert
Handler->>LogFile: Schreibe Event-YAML
LogFile-->>Handler: Saved
end
alt webhook Handler konfiguriert
Handler->>Webhook: POST Event-Payload
Webhook-->>Handler: 200 OK
end
CLI-->>User: Output + Exit Code
style CLI fill:#e1f5ff
style Handler fill:#fff4e1
style Webhook fill:#e1ffe1
style LogFile fill:#ffe1e1 Event Handler¶
Event-Handler können in der Workspace-Konfiguration eingerichtet werden, um Events zu verarbeiten:
1. Workspace Handler¶
Der workspace Handler persistiert Events als YAML-Dateien im .logs/ Verzeichnis:
Events werden dann in .logs/YYYY-MM-DD/<transaction-uuid>.yml gespeichert.
2. Webhook Handler¶
Der webhook Handler sendet Events an einen konfigurierten HTTP-Endpoint:
# workspace.poly
name: polycrate-demo
events:
handler: webhook
endpoint: https://example.com/api/events
# Optional: Headers für Authentifizierung
headers:
Authorization: "Bearer YOUR_TOKEN"
X-Custom-Header: "value"
Webhook-Payloads können für Integration mit Tools wie Slack, Discord, Datadog, etc. verwendet werden.
Event-Format¶
Ein von Polycrate erzeugtes Event sieht folgendermaßen aus:
labels:
monk.event.class: polycrate
monk.event.level: Info
workspace: my-workspace
block: my-block
action: install
command: 'polycrate run my-block install'
user_email: user@example.com
user_name: User Name
date: "2023-04-13T19:09:52+02:00"
transaction: 3159301c-0b5d-495d-8a31-e2e831723bbc
version: 0.18.21
config:
handler: workspace
Event-Felder:
labels.monk.event.class: Event-Kategorie (immer "polycrate")labels.monk.event.level: Event-Level (Info, Warning, Error)workspace: Name des Workspacesblock: Name des ausgeführten Blocksaction: Name der ausgeführten Actioncommand: Vollständiger CLI-Befehluser_email/user_name: Informationen zum ausführenden Userdate: ISO 8601 Timestamptransaction: Eindeutige Transaction-IDversion: Polycrate Version
Praktische Beispiele¶
Beispiel 1: Slack Integration¶
# workspace.poly
name: production-workspace
events:
handler: webhook
endpoint: https://hooks.slack.com/services/YOUR/SLACK/WEBHOOK
workflows:
- name: deploy-production
steps:
- name: deploy-app
block: production-app
action: deploy
Erstellen Sie einen Slack Webhook und alle Events werden automatisch an Ihren Slack-Channel gesendet.
Beispiel 2: Custom Event Processing¶
# workspace.poly
name: monitored-workspace
events:
handler: webhook
endpoint: https://api.mycompany.com/polycrate-events
headers:
Authorization: "Bearer ${POLYCRATE_EVENT_TOKEN}"
API-Endpoint-Beispiel (Node.js):
// Express.js endpoint
app.post('/polycrate-events', (req, res) => {
const event = req.body;
// Log event
console.log(`Polycrate Event: ${event.block}:${event.action} - ${event.transaction}`);
// Send to monitoring system
if (event.labels['monk.event.level'] === 'Error') {
sendToDatadog({
title: `Polycrate Failure: ${event.block}`,
text: `Action ${event.action} failed in workspace ${event.workspace}`,
tags: [`workspace:${event.workspace}`, `block:${event.block}`],
alert_type: 'error'
});
}
// Store in database
db.events.insert({
transaction_id: event.transaction,
workspace: event.workspace,
block: event.block,
action: event.action,
timestamp: new Date(event.date),
success: event.labels['monk.event.level'] === 'Info'
});
res.sendStatus(200);
});
Beispiel 3: Multi-Workspace Monitoring¶
# workspace-a.poly
name: workspace-a
events:
handler: webhook
endpoint: https://central-monitor.company.com/events
headers:
X-Workspace-ID: "workspace-a"
# workspace-b.poly
name: workspace-b
events:
handler: webhook
endpoint: https://central-monitor.company.com/events
headers:
X-Workspace-ID: "workspace-b"
Sammeln Sie Events von mehreren Workspaces in einem zentralen Monitoring-System.
Beispiel 4: CI/CD Integration¶
# .github/workflows/deploy.yml
name: Deploy with Polycrate
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Configure Polycrate Events
run: |
cat >> workspace.poly <<EOF
events:
handler: webhook
endpoint: ${{ secrets.SLACK_WEBHOOK }}
EOF
- name: Deploy
run: polycrate workflows run deploy-production
Beispiel 5: Debugging mit Workspace Handler¶
# workspace.poly (für Entwicklung/Debug)
name: dev-workspace
events:
handler: workspace # Lokales Logging für Debugging
# Events lokal inspizieren
ls -la .logs/$(date +%Y-%m-%d)/
# Neuestes Event anzeigen
ls -t .logs/*/*.yml | head -1 | xargs cat
# Events filtern
grep -r "monk.event.level: Error" .logs/
Event-Level¶
Events haben verschiedene Level basierend auf dem Action-Ergebnis:
graph LR
Action[Action Execution] --> ExitCode{Exit Code?}
ExitCode -->|0| Success[Event Level: Info]
ExitCode -->|≠0| Failure[Event Level: Error]
Success --> Handler[Event Handler]
Failure --> Handler
style Success fill:#e1ffe1
style Failure fill:#ffe1e1
style Handler fill:#fff4e1 - Info: Action wurde erfolgreich ausgeführt (Exit Code 0)
- Error: Action ist fehlgeschlagen (Exit Code ≠ 0)
- Warning: (Reserviert für zukünftige Features)
Best Practices¶
1. Webhook Authentifizierung¶
Sichern Sie Ihre Webhook-Endpoints mit Authentifizierung:
events:
handler: webhook
endpoint: https://api.company.com/events
headers:
Authorization: "Bearer ${WEBHOOK_TOKEN}" # Aus Environment Variable
2. Fehler-Alerting¶
Richten Sie Alerting für fehlgeschlagene Events ein:
// Webhook Handler
if (event.labels['monk.event.level'] === 'Error') {
sendAlert({
channel: '#ops-critical',
message: `🚨 Polycrate Deployment Failed!
Workspace: ${event.workspace}
Block: ${event.block}
Action: ${event.action}
Transaction: ${event.transaction}
User: ${event.user_name}
`
});
}
3. Event-Retention¶
Begrenzen Sie die Speicherung von Events:
# Cron-Job: Alte Events löschen (älter als 30 Tage)
0 2 * * * find /path/to/workspace/.logs -type f -mtime +30 -delete
4. Strukturiertes Logging¶
Senden Sie Events an strukturierte Logging-Systeme:
events:
handler: webhook
endpoint: https://logs.datadoghq.com/api/v2/logs
headers:
DD-API-KEY: "${DATADOG_API_KEY}"
5. Event-Correlation¶
Nutzen Sie Transaction-IDs für Event-Correlation:
# Alle Events einer Transaction finden
TX_ID="550e8400-e29b-41d4-a716-446655440000"
grep -r "transaction: ${TX_ID}" .logs/
Troubleshooting¶
Webhook wird nicht aufgerufen¶
# Prüfen Event-Konfiguration
cat workspace.poly | grep -A 5 "events:"
# Prüfen Netzwerk-Verbindung
curl -X POST https://your-webhook.com/endpoint
# Prüfen Polycrate Logs
polycrate run myblock install --verbose
Events werden nicht geschrieben¶
# Prüfen ob .logs/ Verzeichnis existiert
ls -la .logs/
# Prüfen Berechtigungen
ls -la | grep .logs
# Manuell erstellen falls nötig
mkdir -p .logs
Webhook Timeout¶
# Erhöhen Sie Webhook-Timeout (falls unterstützt)
events:
handler: webhook
endpoint: https://slow-endpoint.com/events
timeout: 30s # Abhängig von Implementation
Zusammenhang mit anderen Konzepten¶
- Transactions: Jedes Event ist mit einer Transaction verknüpft
- Workflows: Workflow-Ausführung erzeugt Events für jeden Step
- Monitoring: Events können an Monitoring-Systeme wie Datadog, Prometheus oder Grafana gesendet werden
Event-Driven Operations
Nutzen Sie Events für Event-Driven Operations: Triggern Sie automatische Rollbacks, Notifications oder Follow-up-Actions basierend auf Polycrate-Events!