2017-04-01 4 views
0

Wir wollen Zipkin in unserem Stack implementieren. Wenn ich auf Zipkin eingehe, ist es für mich sinnvoll, das Zipkin-System auch auf generische Flags zu erweitern.Soll ich Zipkin-Dienstbibliotheken ändern, um generische Merkmalsflags zu übergeben?

Beobachtungen:

  1. Jede Implementierung von Zipkin muss „B3“ Eigenschaftswerte (Header in HTTP) und propagieren sie auf Anfragen weiter unten den Stapel erfassen.
  2. sind einige Werte mutiert
  3. sind einige Werte nur propagiert (Sampled, Debug)

Fazit:

  • Zipkin Erweiterung mit der Option (X-) B3-Flag- Schlüssel zu propagieren/Wertpaare sind sinnvoll.
  • Dies ermöglicht A/B-Tests und Blue/Green Deploy.
  • Diese Techniken müssen häufig Timings vergleichen, um sicherzustellen, dass Timings sind ähnliche oder verbesserte, es sei denn durch die Service-Entwicklungsteam zur Kenntnis genommen.

Antwort

1

Der TL; DR; in ihrem Umfang nicht, und aus diesem Grund jede Lösung, die B3 in einer solchen Weise erstreckt, würde nicht kompatibel mit vorhandenen Code zu Protokollierungsdaten Neben Durchführung: ist, dass B3 propagation zunächst für feste Größendaten entwickelt wurde.

Also, das bedeutet, dass jede Lösung wie diese eine Erweiterung sein wird, die benutzerdefinierte Handhabung in der instrumented apps bedeutet, die die Dinge übergeben Header sind. Dem Server ist das egal, da er diese Header sowieso nie sieht.

Möglichkeiten, die Menschen in der Regel andere integrieren Dinge wie Flaggen mit Zipkin ist ein Tag aka binäre Anmerkung einschließlich der Wert (in der Regel in der Wurzel Spanne) hinzuzufügen. Dies würde Ihnen ermöglichen, diese offline abzufragen oder abzurufen, aber es adressiert keine Suchen in Flugzeugen von Anwendungen.

sagen lassen, dass statt einen Vermittler wie linkerd zu verwenden, oder eine plattformspezifische propagierte Zusammenhang wir die Verantwortung für die Verfolgung Schicht versenden wollen. Erstens, welche Art von Daten könnte in Ordnung sein? Am einfachsten ist etwas, das einmal eingestellt wurde (wie zipkins Trace-ID). Alles, was gesetzt und propagiert wird, ohne es zu mutieren, ist die geringste Mechanik. Die nächste Schwierigkeit besteht darin, neue Einträge mitten im Stream anzuhängen, und am schwierigsten ist das Ändern/Zusammenführen von Einträgen.

Nehmen wir an, diese für eingehende Flags, die nie durch die Anfrage/trace Baum ändern. Wir sehen eine Kopfzeile bei der Verarbeitung von Trace-Daten, speichern diese und leiten sie weiter. Wenn dieser Wert vom Verfolgungssystem nicht gelesen werden muss, ist dies am einfachsten, da es sich hauptsächlich um eine Transport-/Vermehrungsangelegenheit handelt. Zum Beispiel könnte eine andere Middleware diesen Header lesen und es ist nur ein "Nebenjob", den wir dem Tracer hinzufügen, um sich bestimmte Dinge zu merken. Wenn dies in einem einzigen Header gemacht würde, wäre es weniger Code als ein Muster an jeder der Stellen, die hinzugefügt werden würden. Es wäre noch weniger Code, wenn die Flags in einer Zahl codiert werden könnten, wie unrealistisch das auch sein mag.

Es gibt Bibliotheken mit API, um den propagierten Kontext manuell zu bearbeiten, z. B. "baggage" from brownsys und OpenTracing (von denen einige Bibliotheken zipkin unterstützen). Ersteres zielt darauf ab, eine generische Schicht für alle Instrumente zu sein (z. B. Überwachung, Rückbelastung, Rückverfolgung usw.), und Letzteres ist spezifisch für die Rückverfolgung. OpenTracing hat abstrakte Typen wie injector and extractor definiert, die angepasst werden können, um andere Felder zu tragen.Sie benötigen jedoch immer noch eine konkrete Implementierung (die Ihr Header-Format usw. kennt), um dies zu tun. Wenn Sie nicht möchten, dass Anwendungen diese Daten lesen, muss dies ein geheimes Detail dieser Implementierung sein (insbesondere der Trace-Kontext).

Bestimmte zipkin-spezifische Bibliotheken wie Spring Cloud Sleuth und Brave verfügen über customize how headers are parsed, um Varianten von B3 oder neue oder standortspezifische Trace-Formate zu unterstützen. Nicht alle unterstützen dies im Moment, aber ich würde erwarten, dass diese Art von Feature häufiger wird. Dies bedeutet, dass Sie möglicherweise eine Operation durchführen müssen, um alle Plattformen zu unterstützen, die Sie möglicherweise unterstützen müssen.

So lange Geschichte kurz ist, dass es einige Bibliotheken gibt, die in Bezug auf die Verbreitung steckbar sind, und diese werden am einfachsten zu ändern, um diesen Anwendungsfall zu unterstützen. Irgendein Code wird benötigt, obwohl B3 momentan keinen solchen Ausdruck definiert.

Verwandte Themen