Skip to main content

Ziel

Dieses Tutorial beschreibt Schritt für Schritt, wie das Skript kameleoon_to_confluence.py funktioniert. Anhand einer Kameleoon-Experiment-ID, einer Confluence-Site und einer Confluence-Space-ID ruft das Skript die Experimentmetadaten und die statistischen Ergebnisse ab, ermittelt die leistungsstärkste Variation, bildet die Daten auf das Confluence-Seitenschema ab und schreibt einen Datensatz per Upsert auf eine Confluence-Seite. Ein erneuter Lauf des Skripts für dasselbe Experiment aktualisiert die bestehende Zeile, statt ein Duplikat zu erstellen. Die Schritte 1–5 verwenden denselben Anfrage- und Abfrage-Ablauf wie das Airtable-Export-Tutorial. Nur das Ziel ist unterschiedlich.

Alternative: Export mit einem KI-Assistenten statt mit dem Skript

Das Ausführen des Skripts erfordert eine Python-Umgebung, vier hinterlegte Anmeldedaten und einen manuellen erneuten Lauf für jedes Experiment, das Sie exportieren möchten. Wenn Sie bereits einen MCP-kompatiblen KI-Assistenten wie Claude verwenden, können Sie denselben Export stattdessen aus einer Konversation heraus durchführen, indem Sie ihn mit den Remote-MCP-Servern (Model Context Protocol) von Kameleoon und Atlassian verbinden – entweder über ein Coding-Tool oder direkt in der Claude-App. Folgen Sie unserem Leitfaden, um Ergebnisse mit Claude zu exportieren.
Der Atlassian MCP Server stellt Tools über Jira, Confluence und Bitbucket bereit, einschließlich Schreibzugriff auf Confluence-Seiten. Der Kameleoon MCP Server kann auch Experimente und Feature Flags starten, pausieren, stoppen oder löschen. Überprüfen Sie jede Aktion, die einer der beiden Connectors vorschlägt, bevor Sie sie genehmigen.

Voraussetzungen

  • Kameleoon-API-Anmeldedaten. Die Automation API erfordert ein Access Token. Das Skript ruft dieses programmgesteuert anhand einer client_id und eines client_secret über den client_credentials-Grant ab. Siehe Access Token abrufen.
  • Ein Confluence-API-Token, gepaart mit der E-Mail-Adresse des Kontos, zu dem es gehört. Erstellen Sie ein Token auf id.atlassian.com/manage-profile/security/api-tokens. Das Skript sendet beide als HTTP-Basic-Authentifizierung auf jeder Confluence-Anfrage.
  • Die numerische Confluence-Space-ID für den Space, der die Seite enthält. Im Gegensatz zu einer Notion-Datenbank-ID oder einer Airtable-Base-ID erscheint die numerische Space-ID nicht in ihrer URL (diese URL zeigt stattdessen den Space-Schlüssel), und sie wird auch nirgendwo in der Confluence-Benutzeroberfläche angezeigt. Bitten Sie einen MCP-verbundenen KI-Assistenten, sie für Sie nachzuschlagen, oder rufen Sie sie selbst vom Confluence-REST-API-Endpoint Get spaces ab.
  • Python 3.9+ mit der Bibliothek requests (pip install requests).
Confluence hat kein Äquivalent zu einer Notion-Datenbank oder einer Airtable-Tabelle, die Sie im Voraus erstellen. Das Skript erstellt die Zielseite selbst mit ihrer Tabelle beim ersten Lauf. Bei jedem späteren Lauf findet es diese Seite nach Titel und aktualisiert sie.
Speichern Sie alle Anmeldedaten in Umgebungsvariablen. Codieren Sie Geheimnisse niemals fest im Skript.
Das Tutorial verwendet das Beispielexperiment Product Page Redesign (ID 188308) mit zwei Variationen zusätzlich zur Originalversion: Variation 828220 und Variation 828221.

1. Bei der Automation API authentifizieren

Endpoint: Rufen Sie ein Access Token ab, indem Sie eine POST-Anfrage an den Token-Endpoint senden.
Beispiel:
Antwort:
Senden Sie den zurückgegebenen access_token als Bearer-Token bei jeder weiteren Anfrage an die Automation API. Access Tokens sind standardmäßig 2 Stunden lang gültig.

2. Das Experiment abrufen

Endpoint: Rufen Sie die Experimentmetadaten ab, indem Sie eine GET-Anfrage an den Endpoint Get an experiment senden.
Beispiel:
Antwort (gekürzt):
Das Skript liest name, status, dateStarted, dateEnded und description für die Confluence-Zeile sowie mainGoalId, um die Ergebnisanfrage im nächsten Schritt einzugrenzen.
Die API gibt mainGoalId standardmäßig zurück, sodass Sie keinen optionalFields-Parameter benötigen, um sie zu lesen. Die Automation API veröffentlicht kein festes Enum für das Feld status, aber andere statusartige Felder in der gesamten API verwenden durchgängig Token in Großbuchstaben (zum Beispiel STOPPED, ACTIVE, DRAFT). Schritt 6 bildet das Feld status unter dieser Annahme ab. Bestätigen Sie die genauen Token, die Ihr Konto zurückgibt, mit einer Live-Anfrage, bevor Sie sich auf dieses Mapping verlassen.

3. Die Ergebnisse des Experiments anfordern

Endpoint: Lösen Sie die Erstellung des Ergebnisberichts aus, indem Sie eine POST-Anfrage an den Endpoint Request experiment’s results senden.
Beispiel:
Antwort:
Kameleoon erstellt den Bericht asynchron. Der Endpoint gibt einen dataCode zurück, den Schritt 4 verwendet, um das Ergebnis abzufragen.
Dieses Skript erfordert bayesian: true und setzt sequentialTesting: false. bayesian und sequentialTesting sind alternative Methoden zur Berechnung der Signifikanz, und dieses Tutorial gibt die Bayesianische Erfolgswahrscheinlichkeit aus. Bei aktiviertem Bayesian-Modus trägt der Wert reliability des Berichts die Bayesianische Erfolgswahrscheinlichkeit (die Wahrscheinlichkeit, dass eine Variation die Referenz übertrifft), die das Skript auf das Feld Probability abbildet. Gleichen Sie den Wert mit demselben Bericht in der Kameleoon-App ab, wenn Ihr Konto eine andere Standardstatistikmethode verwendet.

4. Die Ergebnisse abfragen

Endpoint: Rufen Sie den Bericht ab, indem Sie GET-Anfragen an den Endpoint Poll results senden, bis er bereit ist.
Der status der Antwort lautet WAITING, solange Kameleoon den Bericht berechnet, READY, sobald die Daten verfügbar sind, oder ERROR beziehungsweise TIMEOUT bei einem Fehler. Wenn der Status ERROR oder TIMEOUT lautet, enthält die Antwort ein errorDescription-Feld auf oberster Ebene. Das Skript fragt in einem festen Intervall ab, bis der Status READY lautet. Beispiel:
Antwort (gekürzt):

5. Die leistungsstärkste Variation auswählen

Die Ergebnisse enthalten unter variationData einen Eintrag pro Variation sowie die Zeile _reference für die Originalseite. Für jede Variation liegen die Metriken für das angeforderte Ziel unter breakdownData._reference.generalData.goalsData[goalId]. Das Skript überspringt den Eintrag _reference, liest für jede Variation improvementRate und reliability (die Bayesianische Erfolgswahrscheinlichkeit) und wählt die Variation mit der höchsten Verbesserungsrate als leistungsstärkste aus. Das im nächsten Schritt abgebildete Feld Result erfasst, ob diese Variation tatsächlich gewonnen hat: ob sie eine ausreichend hohe Erfolgswahrscheinlichkeit bei einer positiven Verbesserung erreicht hat. Beispiel:
Im Beispiel erreichen beide Variationen eine Bayesianische Erfolgswahrscheinlichkeit von 100 %, aber Variation 828220 zeigt eine Verbesserung von +211,48 % gegenüber -43,33 % bei Variation 828221. Variation 828220 ist daher die leistungsstärkste Variation und, mit einer Wahrscheinlichkeit über 95 % und einer positiven Verbesserung, ein echter Gewinner.

6. Die Daten auf Confluence-Spalten abbilden

Das Skript wandelt die Experimentmetadaten und die Metriken der leistungsstärksten Variation in eine Zeile für die Confluence-Tabelle um und verwendet dabei dieselben acht Spalten wie die Notion- und Airtable-Exporte. Beispiel:
Die Automation API veröffentlicht kein festes Enum für das Feld status des Experiments, und die Token können sich weiterentwickeln. map_status vergleicht ohne Berücksichtigung der Groß-/Kleinschreibung und gibt für einen nicht erkannten Status None zurück, wodurch die Zelle Status verworfen wird, statt einen falschen Wert zu schreiben. Bestätigen Sie die Token, die Ihr Konto zurückgibt, mit einer einzelnen GET /experiments/{experimentId}-Anfrage, und erweitern Sie STATUS_MAP bei Bedarf.

7. Die vorhandene Experiments-Tabelle analysieren

Confluence hat kein Datenbank- oder Tabellenobjekt an sich. Stattdessen verwaltet das Skript eine dedizierte Seite mit einer einzelnen HTML-Tabelle darauf, eine Zeile pro Experiment, und behandelt die Spalte Experiment Name genauso wie Notion eine Titeleigenschaft oder Airtable ein Merge-Feld behandelt: als den Schlüssel, auf den es einen Upsert durchführt. Das Skript erstellt diese Tabelle mit einem full-width-Layout, statt des schmaleren Standardlayouts von Confluence, da acht Spalten mit mittellangen Kopfzeilen bei der Standardseitenbreite umgebrochen werden. Confluences Speicherformat (das HTML-ähnliche Markup, in dem der Inhalt einer Seite gespeichert ist) wickelt den Text jeder Zelle in ein <p>-Tag, und eine neu erstellte Seitenkopfzeile ist einfaches <tr><th>...</th></tr> ohne umgebendes <thead>. Der untenstehende Parser, basierend auf Pythons Standard html.parser.HTMLParser, verarbeitet sowohl diesen bloßen Header-Fall als auch einen von <thead> umhüllten, und behandelt eine leere Zelle gleich, ob Confluence sie als leeres <p></p> oder selbstschließendes <p /> rendert. Er stoppt auch beim ersten </table>, sodass eine zweite Tabelle an anderer Stelle auf der Seite (eine, die Sie von Hand hinzugefügt haben, zum Beispiel) niemals in das analysierte Ergebnis verschmilzt, und schließt jede Zeile oder Zelle, die eine fehlerhafte Bearbeitung offen gelassen hat, ob das nächste Tag eine neue Zeile öffnet oder die Tabelle selbst endet, damit ein verirrtes nicht geschlossenes Tag keine Zeile verlieren kann. Beispiel:
reorder_row schützt vor einer Tabelle, deren Spalten in Confluence manuell neu angeordnet wurden, zum Beispiel wenn eine Person eine Spalte im Editor zieht. Ohne es würde eine Nachschlageverfolgung nach Position die Spalte Experiment Name der neuen Zeile gegen alles vergleichen, was jetzt an dieser Position in der vorhandenen Tabelle sitzt, wodurch die falsche Zeile stillschweigend abgeglichen oder gar keine wird. Sie richtet nur eine echte Neuanordnung aus, wenn der Header immer noch dieselben acht Beschriftungen in einer anderen Reihenfolge hat. Wenn der Text einer Kopfzelle selbst bearbeitet wurde, zum Beispiel wenn Notes in Comments umbenannt wurde, stimmen die Beschriftungen nicht länger mit HEADER überein, also fällt die Funktion auf die vorhandene Spaltenreihenfolge zurück und gibt eine Warnung aus, statt zu raten, statt stumm diese Spalte Daten auf jeder Zeile zu löschen.

8. Die Confluence-Seite finden, erstellen oder aktualisieren

Suchen: Suchen Sie die Seite nach Titel innerhalb des Spaces unter Verwendung der Query-Parameter title und space-id auf dem Endpoint Get pages. Das Übergeben von body-format=storage gibt den aktuellen Tabelleninhalt im selben Aufruf zurück.
Erstellen: Wenn keine Seite übereinstimmt, erstellen Sie eine mit dem Endpoint Create page, wobei die Tabelle bereits aus einer einzelnen Zeile erstellt ist.
Aktualisieren: Wenn eine Seite übereinstimmt, erstellen Sie die gesamte Tabelle aus ihren vorhandenen Zeilen plus der upgeserteten neu auf und überschreiben Sie die Seite mit dem Endpoint Update page.
Confluence hat keinen Schreibvorgang pro Zeile oder pro Feld. Das Aktualisieren einer Seite ersetzt ihren gesamten Body, daher liest das Skript immer die aktuelle Tabelle, upsert eine Zeile im Speicher und schreibt die gesamte Tabelle zurück. Diese ganze Body-Ersetzung unterscheidet sich vom Airtable-Export, der einen einzelnen Datensatz patcht, und vom Notion-Export, der die Eigenschaften einer einzelnen Seite patcht.
Im Gegensatz zu den Notion- und Airtable-APIs erfordert Confluence vom Aufrufer, version.number bei jedem Update auf die aktuelle Versionsnummer plus eins zu inkrementieren. Das erneute Senden der aktuellen Nummer oder das Auslassen von version lässt die Anfrage fehlschlagen. Ein MCP-verbundener KI-Assistent mit Atlassian-eigenen Tools verarbeitet dies automatisch; ein direkter REST-Aufruf, wie in diesem Skript, nicht.
Beispiel:
Antwort (gekürzt):

9. Das Skript ausführen

Übergeben Sie die Experiment-ID, die Confluence-Site und die Space-ID als Argumente:
Das Skript gibt jeden Schritt aus: Authentifizierung, das abgerufene Experiment, die leistungsstärkste Variation, die zugeordnete Zeile sowie, ob es die Confluence-Seite erstellt oder aktualisiert hat. Übergeben Sie --page-title, um eine Seitennamen andere als den Standard Experiments anzugeben.

Vollständiges Skript

Das vollständige Skript unten entspricht Funktion für Funktion kameleoon_to_confluence.py. Kopieren Sie es direkt, oder laden Sie die Datei über diesen Link herunter.

Anpassungshinweise

  • Status-Mapping befindet sich in der Konstante STATUS_MAP, die anhand der von der API zurückgegebenen Status-Token in Großbuchstaben indiziert ist. Passen Sie die Zielwerte an, wenn Ihre Status-Beschriftungen von Running / Implementing / Completed / Defunct abweichen, und bestätigen Sie die Token, die Ihr Konto zurückgibt, mit einer Live-Anfrage GET /experiments/{experimentId}, bevor Sie sich auf das Mapping verlassen.
  • Probability stammt aus der gemessenen Bayesianischen Erfolgswahrscheinlichkeit, wofür bayesian: true in der Ergebnisanfrage erforderlich ist. Wenn Sie eine Vor-Experiment-Schätzung statt einer gemessenen bevorzugen, entfernen Sie die Zeile Probability aus build_row.
  • Zielauswahl verwendet die mainGoalId des Experiments. Um über ein anderes Ziel zu berichten, übergeben Sie dessen ID an request_results und pick_best_variation.
  • Upsert-Schlüssel. Der Abgleich nach Experiment Name ist exakt, daher erstellen Unterschiede bei Groß-/Kleinschreibung oder Leerzeichen eine neue Zeile, statt die bestehende zu aktualisieren. Weil der Find-then-Write-Ablauf nicht atomar ist, vermeiden Sie das gleichzeitige Ausführen zweier Exporte für dasselbe Experiment, und vermeiden Sie das Umbenennen eines Experiments zwischen Läufen, wenn Sie nicht auch eine neue Zeile dafür möchten.
  • Ganz-Seiten-Updates. Jede Aktualisierung schreibt die gesamte Tabelle neu, da Confluence keinen Schreibvorgang pro Zeile hat. Wenn Sie die Seite zwischen Skriptläufen von Hand verwalten, halten Sie Ihre Bearbeitungen innerhalb der Tabelle, die das Skript erstellt. Das Skript bewahrt derzeit Inhalte außerhalb dieser Tabelle nicht.
  • Versionskonflikte. Das Skript liest immer die aktuelle version.number der Seite unmittelbar vor dem Schreiben, daher lässt eine zwischen dem Lesen und dem Schreiben vorgenommene manuelle Bearbeitung die nächste PUT mit einem Versionskonflikt fehlschlagen. Führen Sie das Skript erneut aus, wenn dies geschieht.
  • Rate Limits. Die Automation API erlaubt bis zu 50 Anfragen pro 10 Sekunden und 1.000 pro Stunde, aber Kameleoon empfiehlt, pro Konto unter 12 Aufrufen pro Minute zu bleiben. Confluence Cloud erzwingt seine eigenen Rate Limits, die je nach Plan variieren; siehe Atlassian-Dokumentation zu Rate Limiting für aktuelle Werte. Wenn Sie viele Experimente in Batches verarbeiten, cachen Sie Tokens, drosseln Sie Anfragen, und ziehen Sie für Anwendungsfälle mit hohem Volumen die Data API in Betracht.