{"id":31014,"date":"2019-10-31T21:38:54","date_gmt":"2019-10-31T18:38:54","guid":{"rendered":"https:\/\/prohoster.info\/blog\/trassirovka-servisov-opentracing-i-jaeger\/"},"modified":"2019-10-31T21:38:54","modified_gmt":"2019-10-31T18:38:54","slug":"trassirovka-servisov-opentracing-i-jaeger","status":"publish","type":"post","link":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","title":{"rendered":"Tracing von Diensten, OpenTracing und Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Tracing von Diensten, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn unseren Projekten verwenden wir eine mikroservicebasierte Architektur. Bei der Entstehung von Engp\u00e4ssen in der Leistung wird viel Zeit f\u00fcr das Monitoring und die Analyse von Protokollen aufgewendet. Bei der Protokollierung der Zeiten einzelner Vorg\u00e4nge in die Logdatei ist es in der Regel schwierig zu verstehen, was zu den Aufrufen dieser Vorg\u00e4nge gef\u00fchrt hat, die Reihenfolge der Aktionen nachzuvollziehen oder die zeitliche Verschiebung eines Vorgangs im Verh\u00e4ltnis zu einem anderen in verschiedenen Diensten zu verfolgen. <\/p>\n<p>Um den manuellen Aufwand zu minimieren, haben wir uns entschieden, ein Werkzeug zur Tracierung zu nutzen. In diesem Artikel werden wir er\u00f6rtern, wie und wozu Tracierung verwendet werden kann und wie wir es gemacht haben. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Welche Probleme k\u00f6nnen mit Tracierung gel\u00f6st werden<\/h3>\n<p><\/p>\n<ol>\n<li>Engp\u00e4sse in der Leistung sowohl innerhalb eines einzelnen Dienstes als auch im gesamten Ausf\u00fchrungsbaum zwischen allen beteiligten Diensten zu finden. Zum Beispiel:\n<ul>\n<li>Viele kurze aufeinanderfolgende Aufrufe zwischen Diensten, zum Beispiel f\u00fcr Geokodierung oder auf die Datenbank.<\/li>\n<li>Lange Wartezeiten beim Ein- und Ausgabe, zum Beispiel beim Datentransfer \u00fcber das Netzwerk oder beim Lesen von der Festplatte.<\/li>\n<li>Langes Parsen von Daten.<\/li>\n<li>Lange Operationen, die CPU erfordern.<\/li>\n<li>Codeabschnitte, die f\u00fcr das Endergebnis nicht erforderlich sind und entfernt oder verz\u00f6gert ausgef\u00fchrt werden k\u00f6nnen.<\/li>\n<\/ul>\n<\/li>\n<li>Visuell nachvollziehen, in welcher Reihenfolge was aufgerufen wird und was passiert, wenn eine Operation ausgef\u00fchrt wird.<br \/>\n<img decoding=\"async\" alt=\"Tracing von Diensten, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEs ist sichtbar, dass zum Beispiel die Anfrage im Dienst WS angekommen ist -&gt; der Dienst WS die Daten \u00fcber den Dienst R erg\u00e4nzt hat -&gt; dann eine Anfrage an den Dienst V gesendet hat -&gt; der Dienst V viele Daten aus dem Dienst R geladen hat -&gt; dann den Dienst P aufgerufen hat -&gt; der Dienst R ein weiteres Mal aufgerufen wurde -&gt; der Dienst V das Ergebnis ignorierte und zum Dienst J ging -&gt; und erst danach die Antwort an den Dienst WS zur\u00fcckgab, w\u00e4hrend im Hintergrund weiterhin etwas anderes berechnet wurde.<br \/>\nOhne ein solches Trace oder detaillierte Dokumentation des gesamten Prozesses ist es sehr schwer zu verstehen, was vor sich geht, wenn man zum ersten Mal den Code betrachtet, und der Code ist zudem \u00fcber verschiedene Dienste verteilt und hinter einer Vielzahl von Beans und Schnittstellen verborgen.\n<\/li>\n<li>Sammlung von Informationen \u00fcber den Ausf\u00fchrungsbaum zur sp\u00e4teren verz\u00f6gerten Analyse. In jedem Ausf\u00fchrungsstadium k\u00f6nnen im Trace Informationen hinzugef\u00fcgt werden, die zu diesem Zeitpunkt verf\u00fcgbar sind, um anschlie\u00dfend herauszufinden, welche Eingangsdaten zu einem solchen Szenario gef\u00fchrt haben. Zum Beispiel:\n<ul>\n<li>Benutzer-ID<\/li>\n<li>Berechtigungen<\/li>\n<li>Art der gew\u00e4hlten Methode<\/li>\n<li>Log oder Ausf\u00fchrungsfehler<\/li>\n<\/ul>\n<\/li>\n<li>Die Umwandlung von Traces in eine Teilmenge von Metriken und die anschlie\u00dfende Analyse in Form von Metriken.<\/li>\n<\/ol>\n<h3>Was die Trace-Logging-Funktionalit\u00e4t bietet. Span<\/h3>\n<p>In der Trace-Analyse gibt es das Konzept des Span, das einem einzelnen Log in der Konsole entspricht. Ein Span hat folgende Eigenschaften:<\/p>\n<ul>\n<li>Name, normalerweise der Name der ausgef\u00fchrten Methode<\/li>\n<li>Name des Dienstes, in dem der Span generiert wurde<\/li>\n<li>Eindeutige eigene ID<\/li>\n<li>Irgendeine Meta-Information in Form von Key\/Value, die darin protokolliert wurde. Zum Beispiel, Parameter der Methode oder ob die Methode mit einem Fehler beendet wurde oder nicht<\/li>\n<li>Die Start- und Endzeit der Ausf\u00fchrung dieses Spans<\/li>\n<li>ID des \u00fcbergeordneten Spans<\/li>\n<\/ul>\n<p>\nJeder Span wird an den Collector gesendet, um in eine Datenbank gespeichert zu werden, f\u00fcr eine sp\u00e4tere Ansicht, sobald er seine Ausf\u00fchrung abgeschlossen hat. Sp\u00e4ter kann ein Baum aller Spans erstellt werden, indem sie nach der ID des Elternteils verbunden werden. Bei der Analyse kann man beispielsweise alle Spans in einem bestimmten Dienst finden, die l\u00e4nger als eine bestimmte Zeit in Anspruch genommen haben. Weiterhin kann man zu einem spezifischen Span gehen und die gesamte Hierarchie \u00fcber und unter diesem Span sehen.<\/p>\n<p><img decoding=\"async\" alt=\"Tracing von Diensten, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jaeger und wie wir dies f\u00fcr unsere Projekte umgesetzt haben<\/h3>\n<p>\nEs gibt einen gemeinsamen Standard <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/\">Opentrace<\/a><\/noindex>, der beschreibt, wie und was gesammelt werden sollte, ohne die Trace-Implementierung an eine spezifische Programmiersprache zu binden. Zum Beispiel wird in Java die gesamte Arbeit mit Traces \u00fcber die gemeinsame API von Opentrace durchgef\u00fchrt, und darunter kann sich beispielsweise Jaeger oder eine leere Standardimplementierung verbergen, die nichts tut.<br \/>\nWir verwenden <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/\">Jaeger<\/a><\/noindex> als Implementierung von Opentrace. Es besteht aus mehreren Komponenten:<\/p>\n<p><img decoding=\"async\" alt=\"Tracing von Diensten, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/1fd4ae8563569271b067861c81101d71.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<ul>\n<li>Jaeger-Agent \u2014 ein lokaler Agent, der normalerweise auf jedem Rechner l\u00e4uft, und in ihn protokollieren die Dienste auf dem lokalen Standardport. Wenn es keinen Agenten gibt, sind die Traces aller Dienste auf diesem Rechner normalerweise deaktiviert.<\/li>\n<li>Jaeger-Collector \u2014 dorthin senden alle Agenten die gesammelten Traces, und er speichert sie in der gew\u00e4hlten Datenbank.<\/li>\n<li>Datenbank \u2014 bevorzugt verwenden sie Cassandra, aber wir nutzen Elasticsearch. Es gibt auch Implementierungen f\u00fcr einige andere Datenbanken und eine In-Memory-Implementierung, die nichts auf der Festplatte speichert.<\/li>\n<li>Jaeger-Query \u2014 dies ist ein Dienst, der in die Datenbank geht und die bereits gesammelten Traces f\u00fcr die Analyse zur\u00fcckgibt.<\/li>\n<li>Jaeger-UI \u2014 dies ist eine Weboberfl\u00e4che zum Suchen und Betrachten von Traces, die auf Jaeger-Query zugreift.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Tracing von Diensten, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAls separate Komponente kann man die Opentrace Jaeger-Implementierung f\u00fcr spezifische Sprachen anf\u00fchren, durch die Spans an den Jaeger-Agenten gesendet werden.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Integration von Jaeger in Java<\/a><\/noindex> Es geht darum, das Interface io.opentracing.Tracer zu implementieren, nach dem alle Traces \u00fcber ihn an den echten Agenten gesendet werden.<\/p>\n<p><img decoding=\"async\" alt=\"Tracing von Diensten, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nAu\u00dferdem kann f\u00fcr Spring-Komponenten die <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">opentracing-spring-cloud-starter<\/a><\/noindex> und die Implementierung von Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\">opentracing-spring-jaeger-cloud-starter<\/a><\/noindex> verwendet werden, die automatisch die Tracing-Konfiguration f\u00fcr alles vornimmt, was durch diese Komponenten geht, wie z.B. HTTP-Anfragen an Controller, Datenbankabfragen \u00fcber JDBC usw.<\/p>\n<h3>Logging von Traces in Java<\/h3>\n<p>\nAn oberster Stelle sollte der erste Span erzeugt werden, was automatisch durch den Spring-Controller beim Empfang einer Anfrage geschehen kann, oder manuell, falls dies nicht der Fall ist. Danach wird er durch den Scope weitergegeben. Wenn eine Methode weiter unten einen Span hinzuf\u00fcgen m\u00f6chte, nimmt sie den aktuellen activeSpan aus dem Scope, erstellt einen neuen Span und gibt an, dass der erhaltene activeSpan der Elternteil ist, wodurch der neue Span aktiv wird. Bei Aufrufen von externen Services wird der aktuelle aktive Span \u00fcbergeben, und diese Services erstellen neue Spans, die mit diesem Span verkn\u00fcpft sind.<br \/>\nDie gesamte Arbeit erfolgt \u00fcber die Instanz von Tracer, die man \u00fcber das DI-Mechanismus oder \u00fcber GlobalTracer.get() als globale Variable erhalten kann, falls das DI-Mechanismus nicht funktioniert. Standardm\u00e4\u00dfig wird, wenn der Tracer nicht initialisiert wurde, der NoopTracer zur\u00fcckgegeben, der nichts macht.<br \/>\nAnschlie\u00dfend wird der aktuelle Scope durch ScopeManager aus dem Tracer abgerufen, ein neuer Scope wird basierend auf dem aktuellen erstellt, mit Verkn\u00fcpfung zum neuen Span, und daraufhin wird der erstellte Scope geschlossen, wodurch der neu erzeugte Span beendet und der vorherige Scope wieder aktiv wird. Scope ist an den Thread gebunden, deshalb sollte man bei der mehrschichtigen Programmierung nicht vergessen, den aktiven Span in einen anderen Thread zu \u00fcbertragen, um den Scope des anderen Threads mit diesem Span zu aktivieren.<\/p>\n<pre><code class=\"java\">io.opentracing.Tracer tracer = ...; \/\/ GlobalTracer.get()\n\nvoid DoSmth () {\n   try (Scope scope = tracer.buildSpan(\"DoSmth\").startActive(true)) {\n      ...\n   }\n}\nvoid DoOther () {\n    Span span = tracer.buildSpan(\"someWork\").start();\n    try (Scope scope = tracer.scopeManager().activate(span, false)) {\n        \/\/ Dinge tun.\n    } catch(Exception ex) {\n        Tags.ERROR.set(span, true);\n        span.log(Map.of(Fields.EVENT, \"error\", Fields.ERROR_OBJECT, ex, Fields.MESSAGE, ex.getMessage()));\n    } finally {\n        span.finish();\n    }\n}\n\nvoid DoAsync () {\n    try (Scope scope = tracer.buildSpan(\"ServiceHandlerSpan\").startActive(false)) {\n        ...\n        final Span span = scope.span();\n        doAsyncWork(() -&gt; {\n            \/\/ SCHRITT 2 OBEN: den Span im Callback reaktivieren, indem true an\n            \/\/ startActive() \u00fcbergeben wird, falls der Span beendet werden muss.\n            try (Scope scope = tracer.scopeManager().activate(span, false)) {\n                ...\n            }\n        });\n    }\n}<\/code><\/pre>\n<p>F\u00fcr die Mehrfadenprogrammierung gibt es auch den TracedExecutorService und \u00e4hnliche Wrapper, die den aktuellen Span automatisch im Thread bei der Ausf\u00fchrung asynchroner Aufgaben weitergeben:<\/p>\n<pre><code class=\"java\">private ExecutorService executor = new TracedExecutorService(\n    Executors.newFixedThreadPool(10), GlobalTracer.get()\n);<\/code><\/pre>\n<p>F\u00fcr externe HTTP-Anfragen gibt es <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-apache-httpclient\">TracingHttpClient<\/a><\/noindex><\/p>\n<pre><code class=\"java\">HttpClient httpClient = new TracingHttpClientBuilder().build();<\/code><\/pre>\n<h3>Die Probleme, mit denen wir konfrontiert waren<\/h3>\n<p><\/p>\n<ul>\n<li>Beans und DI funktionieren nicht immer, wenn der Tracer nicht in einem Service oder einer Komponente verwendet wird, dann <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/users\/autowired\/\" class=\"user_link\">Autowired<\/a><\/noindex> Kann der Tracer m\u00f6glicherweise nicht funktionieren und man muss GlobalTracer.get() verwenden.<\/li>\n<li>Annotationen funktionieren nicht, wenn dies keine Komponente oder ein Service ist, oder wenn der Methodenaufruf aus einer benachbarten Methode derselben Klasse erfolgt. Man muss vorsichtig sein, pr\u00fcfen, was funktioniert, und manuelle Trace-Erstellung verwenden, wenn @Traced nicht funktioniert. Au\u00dferdem kann man einen zus\u00e4tzlichen Compiler f\u00fcr Java-Annotationen hinzuf\u00fcgen, dann sollten sie \u00fcberall funktionieren.<\/li>\n<li>In \u00e4lteren Spring- und Spring-Boot-Versionen funktioniert die Autokonfiguration von OpenTracing Spring Cloud aufgrund von Bugs in DI nicht richtig, daher, wenn man m\u00f6chte, dass die Traces in den Spring-Komponenten automatisch funktionieren, kann man es \u00e4hnlich wie bei <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-jaeger\/blob\/master\/opentracing-spring-jaeger-starter\/src\/main\/java\/io\/opentracing\/contrib\/java\/spring\/jaeger\/starter\/JaegerAutoConfiguration.java\">github.com\/opentracing-contrib\/java-spring-jaeger\/blob\/master\/opentracing-spring-jaeger-starter\/src\/main\/java\/io\/opentracing\/contrib\/java\/spring\/jaeger\/starter\/JaegerAutoConfiguration.java<\/a><\/noindex><\/li>\n<li>In Groovy funktioniert try with resources nicht, man muss unbedingt try finally verwenden.<\/li>\n<li>Jeder Service muss seinen eigenen spring.application.name haben, unter dem die Traces protokolliert werden. Zudem braucht man einen separaten Namen f\u00fcr Produktion und Test, um sie nicht zu vermischen.<\/li>\n<li>Wenn man GlobalTracer und Tomcat verwendet, haben alle Services, die in diesem Tomcat ausgef\u00fchrt werden, einen einzigen GlobalTracer, deshalb haben sie alle denselben Servicenamen.<\/li>\n<li>Beim Hinzuf\u00fcgen von Traces zu einer Methode muss man sicherstellen, dass sie nicht in einer Schleife mehrfach aufgerufen wird. Man sollte einen gemeinsamen Trace f\u00fcr alle Aufrufe hinzuf\u00fcgen, der die Gesamtdauer protokolliert. Andernfalls entsteht eine \u00fcberm\u00e4\u00dfige Last.<\/li>\n<li>Einmal haben wir im Jaeger-UI zu gro\u00dfe Anfragen f\u00fcr eine gro\u00dfe Anzahl von Traces gestellt und da wir nicht auf die Antwort warteten, haben wir es erneut getan. Infolgedessen begann jaeger-query viel Speicher zu verbrauchen und verlangsamte Elastic. Ein Neustart von jaeger-query half.<\/li>\n<\/ul>\n<h3>Sampling, Speicherung und Anzeige von Traces<\/h3>\n<p>\nEs gibt drei Typen <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">Sampling von Traces<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const, der alle Traces sendet und speichert.<\/li>\n<li>Probabilistic, der Traces mit einer bestimmten Wahrscheinlichkeit filtert.<\/li>\n<li>Ratelimiting, das die Anzahl der Traces pro Sekunde einschr\u00e4nkt. Diese Parameter k\u00f6nnen entweder auf dem Client, dem jaeger-agent oder im Collector konfiguriert werden. Momentan verwenden wir in unserem Stack von Validierern const 1, da die Anfragen nicht sehr zahlreich sind, aber sie eine l\u00e4ngere Zeit in Anspruch nehmen. Wenn dies in Zukunft zu einer \u00fcberm\u00e4\u00dfigen Belastung des Systems f\u00fchrt, kann eine Beschr\u00e4nkung vorgenommen werden.<\/li>\n<\/ol>\n<p>\nWenn Cassandra verwendet wird, speichert sie standardm\u00e4\u00dfig Traces nur f\u00fcr zwei Tage. Bei uns werden <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> und Traces werden \u00fcber einen l\u00e4ngeren Zeitraum gespeichert und nicht gel\u00f6scht. F\u00fcr jeden Tag wird ein separater Index erstellt, zum Beispiel jaeger-service-2019-03-04. In Zukunft muss eine automatische Bereinigung alter Traces eingerichtet werden.<\/p>\n<p>Um Traces anzusehen, muss man:<\/p>\n<ul>\n<li>Den Service ausw\u00e4hlen, nach dem die Traces gefiltert werden sollen, zum Beispiel tomcat7-default f\u00fcr den Service, der in Tomcat l\u00e4uft und keinen eigenen Namen haben kann.<\/li>\n<li>Dann die Operation, den zeitlichen Rahmen und die minimale Verweildauer der Operation ausw\u00e4hlen, zum Beispiel ab 10 Sekunden, um nur lange Ausf\u00fchrungen zu erfassen.<br \/>\n<img decoding=\"async\" alt=\"Tracing von Diensten, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/bc712d4aabfe9c2ae961d3b8f9396a42.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<li>In einen der Traces wechseln und sehen, was dort gestockt hat.<br \/>\n<img decoding=\"async\" alt=\"Tracing von Diensten, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nWenn eine bestimmte ID der Anfrage bekannt ist, kann der Trace \u00fcber diese ID durch Tagsuche gefunden werden, wenn diese ID im Span des Traces protokolliert wird.<\/p>\n<h3>Dokumentation<\/h3>\n<p><\/p>\n<ul>\n<li>Dokumentation von OpenTracing <noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/docs\/overview\/what-is-tracing\/\">opentracing.io\/docs\/overview\/what-is-tracing<\/a><\/noindex><\/li>\n<li>Dokumentation von Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Jaeger Java-Integration <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">github.com\/jaegertracing\/jaeger-client-java<\/a><\/noindex><\/li>\n<li>Spring OpenTracing-Integration<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">github.com\/jaegertracing\/jaeger-client-java<\/a><\/noindex><br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/opentracing-contrib\/java-spring-cloud\">github.com\/opentracing-contrib\/java-spring-cloud<\/a><\/noindex><\/li>\n<\/ul>\n<h3>Artikel<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/carprice\/blog\/340946\/\">habr.com\/ru\/company\/carprice\/blog\/340946<\/a><\/noindex> Jaeger OpenTracing und Microservices in einem realen Projekt mit PHP und Golang<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/eng.uber.com\/distributed-tracing\/\">eng.uber.com\/distributed-tracing<\/a><\/noindex> Evolving Distributed Tracing bei Uber Engineering<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/opentracing.io\/guides\/java\/\">opentracing.io\/guides\/java<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/medium.com\/jaegertracing\/running-jaeger-agent-on-bare-metal-d1fc47d31fab\">medium.com\/jaegertracing\/running-jaeger-agent-on-bare-metal-d1fc47d31fab<\/a><\/noindex> Jaeger Agent auf Bare Metal betreiben<\/li>\n<\/ul>\n<h3>Videos<\/h3>\n<p><\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=qg0ENOdP1Lo\">www.youtube.com\/watch?v=qg0ENOdP1Lo<\/a><\/noindex> Wie wir Jaeger und Prometheus verwendet haben, um blitzschnelle Benutzeranfragen zu liefern \u2013 Bryan Boreham<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=WRntQsUajow\">www.youtube.com\/watch?v=WRntQsUajow<\/a><\/noindex> Intro: Jaeger \u2013 Yuri Shkuro, Uber &amp; Pavol Loffay, Red Hat<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/www.youtube.com\/watch?v=fsHb0qK37bc\">www.youtube.com\/watch?v=fsHb0qK37bc<\/a><\/noindex> Serghei Iakovlev, \u201cEine kleine Geschichte eines gro\u00dfen Sieges: OpenTracing, AWS und Jaeger\u201d<\/li>\n<\/ul>\n<p>Quelle: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/srg\/blog\/446752\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443. \u041f\u0440\u0438 \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u043e\u0432\u0435\u043d\u0438\u0438 \u0443\u0437\u043a\u0438\u0445 \u043c\u0435\u0441\u0442 \u0432 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043c\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0442\u0440\u0430\u0442\u0438\u0442\u0441\u044f \u043d\u0430 \u043c\u043e\u043d\u0438\u0442\u043e\u0440\u0438\u043d\u0433 \u0438 \u0440\u0430\u0437\u0431\u043e\u0440 \u043b\u043e\u0433\u043e\u0432. \u041f\u0440\u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0438 \u0442\u0430\u0439\u043c\u0438\u043d\u0433\u043e\u0432 \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439 \u0432 \u043b\u043e\u0433-\u0444\u0430\u0439\u043b, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043b\u043e\u0436\u043d\u043e \u043f\u043e\u043d\u044f\u0442\u044c \u0447\u0442\u043e \u043f\u0440\u0438\u0432\u0435\u043b\u043e \u043a \u0432\u044b\u0437\u043e\u0432\u0443 \u044d\u0442\u0438\u0445 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0439, \u043e\u0442\u0441\u043b\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 \u0438\u043b\u0438 \u0441\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u0432\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0434\u043d\u043e\u0439 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u0438 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0434\u0440\u0443\u0433\u043e\u0439 \u0432 \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0438\u0441\u0430\u0445. \u0414\u043b\u044f \u043c\u0438\u043d\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":22990,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31014","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"de_DE\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, OpenTracing \u0438 Jaeger | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:38:54+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:38:54+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Service-Tracking, OpenTracing und Jaeger | ProHoster","description":"In unseren Projekten verwenden wir mikroservicebasierte.","canonical_url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"de_DE","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0422\u0440\u0430\u0441\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432, OpenTracing \u0438 Jaeger | ProHoster","og:description":"\u0412 \u043d\u0430\u0448\u0438\u0445 \u043f\u0440\u043e\u0435\u043a\u0442\u0430\u0445 \u043c\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c \u043c\u0438\u043a\u0440\u043e\u0441\u0435\u0440\u0432\u0438\u0441\u043d\u0443\u044e.","og:url":"https:\/\/prohoster.info\/de\/blog\/administrirovanie\/trassirovka-servisov-opentracing-i-jaeger","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:38:54+00:00","article:modified_time":"2019-10-31T18:38:54+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31014","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 04:06:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:26:04","updated":"2026-01-21 04:06:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31014","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/comments?post=31014"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/posts\/31014\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media\/22990"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/media?parent=31014"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/categories?post=31014"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/de\/wp-json\/wp\/v2\/tags?post=31014"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}