{"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":"Service-Tracing, OpenTracing und Jaeger","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Service-Tracing, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/045800f00c8da9702f62cf3de53df7b6.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn unseren Projekten setzen wir auf eine mikroservicebasierte Architektur. Bei der Entstehung von Engp\u00e4ssen in der Leistung wird viel Zeit mit Monitoring und der Analyse von Protokollen verbracht. Beim Protokollieren der Zeitmessungen einzelner Operationen in die Log-Datei ist es in der Regel schwierig nachzuvollziehen, was die Ausf\u00fchrung dieser Operationen ausgel\u00f6st hat, die Reihenfolge der Aktionen zu verfolgen oder die zeitlichen Abweichungen einer Operation im Vergleich zu einer anderen \u00fcber verschiedene Dienste hinweg zu erkennen. <\/p>\n<p>Um den manuellen Aufwand zu minimieren, haben wir uns entschieden, eines der Tracing-Tools zu nutzen. In diesem Artikel werden wir er\u00f6rtern, wie und wof\u00fcr man Tracing einsetzen kann und wie wir dies umgesetzt haben. <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h3>Welche Probleme lassen sich mit Tracing l\u00f6sen<\/h3>\n<p><\/p>\n<ol>\n<li>Den Engpass in der Leistung sowohl innerhalb eines Dienstes als auch im gesamten Ausf\u00fchrungsbaum zwischen allen beteiligten Diensten zu finden. Zum Beispiel:\n<ul>\n<li>Eine Vielzahl von kurzen aufeinanderfolgenden Aufrufen zwischen Diensten, zum Beispiel bei der Geokodierung oder bei Datenbankabfragen.<\/li>\n<li>Lange Wartezeiten bei Ein- und Ausgabe, zum Beispiel bei der Daten\u00fcbertragung \u00fcber das Netzwerk oder beim Lesen von der Festplatte.<\/li>\n<li>Langsame Datenverarbeitung.<\/li>\n<li>Lange CPU-intensive Operationen.<\/li>\n<li>Codeabschnitte, die f\u00fcr das Endergebnis nicht erforderlich sind und entweder entfernt oder verz\u00f6gert ausgef\u00fchrt werden k\u00f6nnen.<\/li>\n<\/ul>\n<\/li>\n<li>Anschaulich verstehen, in welcher Reihenfolge etwas aufgerufen wird und was passiert, wenn eine Operation durchgef\u00fchrt wird.<br \/>\n<img decoding=\"async\" alt=\"Service-Tracing, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/f22f14599568bff5573fe59eeeaea753.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\nEs ist erkennbar, dass zum Beispiel eine Anfrage im Dienst WS einging \u2192 der Dienst WS die Daten \u00fcber den Dienst R erg\u00e4nzt hat \u2192 dann die Anfrage an den Dienst V gesendet hat \u2192 der Dienst V viele Daten aus dem Dienst R geladen hat \u2192 eine Anfrage an den Dienst P gemacht hat \u2192 der Dienst P erneut den Dienst R aufgerufen hat \u2192 der Dienst V das Ergebnis ignoriert und zum Dienst J gegangen ist \u2192 und erst dann die Antwort im Dienst WS zur\u00fcckgegeben hat, w\u00e4hrend er im Hintergrund weiterhin etwas anderes berechnete.<br \/>\nOhne eine solche Tracing- oder ausf\u00fchrliche Dokumentation des gesamten Prozesses ist es sehr schwierig zu verstehen, was passiert, wenn man zum ersten Mal auf den Code schaut, da der Code \u00fcber verschiedene Dienste verteilt ist und hinter vielen Beans und Schnittstellen verborgen ist.\n<\/li>\n<li>Informationssammlung \u00fcber den Ausf\u00fchrungsbaum f\u00fcr eine sp\u00e4tere verz\u00f6gerte Analyse. In jedem Ausf\u00fchrungsschritt k\u00f6nnen Informationen, die zu diesem Zeitpunkt verf\u00fcgbar sind, zum Trace hinzugef\u00fcgt werden, um herauszufinden, welche Eingangsdaten zu diesem Szenario gef\u00fchrt haben. Zum Beispiel:\n<ul>\n<li>Benutzer-ID<\/li>\n<li>Rechte<\/li>\n<li>Art der gew\u00e4hlten Methode<\/li>\n<li>Log oder Ausf\u00fchrungsfehler<\/li>\n<\/ul>\n<\/li>\n<li>Umwandlung von Traces in ein Teilmenge von Metriken und anschlie\u00dfende Analyse in Form von Metriken.<\/li>\n<\/ol>\n<h3>Was kann die Trace-Logging-Funktion aufzeichnen. Span<\/h3>\n<p>In einer Trace gibt es das Konzept des Spans, das einem einzelnen Log in der Konsole entspricht. Ein Span hat:<\/p>\n<ul>\n<li>Eine Bezeichnung, normalerweise der Name der ausgef\u00fchrten Methode<\/li>\n<li>Den Namen des Dienstes, in dem der Span erstellt wurde<\/li>\n<li>Eine eigene, eindeutige ID<\/li>\n<li>Irgendeine Meta-Information in Form von Schl\u00fcssel\/Wert, die darin protokolliert wurde. Zum Beispiel die 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>Die ID des \u00fcbergeordneten Spans<\/li>\n<\/ul>\n<p>\nJeder Span wird an den Collector der Spans gesendet, um in der Datenbank f\u00fcr die sp\u00e4tere Ansicht gespeichert zu werden, sobald seine Ausf\u00fchrung abgeschlossen ist. Sp\u00e4ter kann ein Baum aller Spans erstellt werden, indem die IDs der Eltern verbunden werden. Bei der Analyse k\u00f6nnen beispielsweise alle Spans in einem bestimmten Dienst gefunden werden, die mehr als eine bestimmte Zeit in Anspruch genommen haben. Au\u00dferdem kann man, indem man zu einem bestimmten Span wechselt, den gesamten Baum \u00fcber und unter diesem Span einsehen.<\/p>\n<p><img decoding=\"async\" alt=\"Service-Tracing, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/9cc97f1278af60f0efd5e393cd183c5c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<h3>Opentrace, Jagger 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 soll, ohne sich durch die Traces an eine spezifische Implementierung in einer bestimmten Sprache zu binden. Zum Beispiel erfolgt in Java die gesamte Arbeit mit Traces \u00fcber die gemeinsame API Opentrace, hinter der beispielsweise Jaeger oder eine leere Standardimplementierung, die nichts tut, verborgen sein kann.<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=\"Service-Tracing, 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 jeder Maschine l\u00e4uft und auf den lokalen Standardport loggen die Dienste. Wenn der Agent nicht vorhanden ist, sind die Traces aller Dienste auf dieser Maschine normalerweise deaktiviert.<\/li>\n<li>Jaeger-Collector \u2014 dieser empf\u00e4ngt die gesammelten Traces von allen Agenten und speichert sie in der ausgew\u00e4hlten Datenbank.<\/li>\n<li>Datenbank \u2014 bevorzugt verwenden sie Cassandra, aber wir verwenden Elasticsearch; es gibt Implementierungen f\u00fcr einige andere Datenbanken und eine In-Memory-Implementierung, die nichts auf die Festplatte speichert.<\/li>\n<li>Jaeger-Query \u2014 dies ist ein Dienst, der in die Datenbank geht und die bereits gesammelten Traces zur Analyse zur\u00fcckgibt.<\/li>\n<li>Jaeger-UI \u2014 dies ist die Weboberfl\u00e4che zur Suche und zum Anzeigen von Traces, die auf Jaeger-Query zugreift.<\/li>\n<\/ul>\n<p><img decoding=\"async\" alt=\"Service-Tracing, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/afc415cb5d4f19e7ba18394c2c1a9dd5.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nEin wichtiger Bestandteil ist die Implementierung von OpenTracing Jaeger f\u00fcr spezifische Programmiersprachen, \u00fcber die Spans an den Jaeger-Agent gesendet werden.<br \/>\n<noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">Integration von Jaeger in Java<\/a><\/noindex> besteht darin, das Interface io.opentracing.Tracer zu implementieren, wodurch alle Traces \u00fcber dieses Interface an den echten Agenten gesendet werden.<\/p>\n<p><img decoding=\"async\" alt=\"Service-Tracing, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/5ce4bdfc06def7e4645bd58163e99dab.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nF\u00fcr Spring-Komponenten kann ebenfalls <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> eingebunden werden, die automatisch das Tracing f\u00fcr alles konfiguriert, was durch diese Komponenten l\u00e4uft, wie z.B. HTTP-Anfragen in Controller, Datenbankabfragen \u00fcber JDBC usw.<\/p>\n<h3>Logging von Traces in Java<\/h3>\n<p>\nAn oberster Stelle sollte der erste Span erstellt werden, was automatisch durch den Spring-Controller bei Empfang einer Anfrage geschehen kann, oder manuell, falls dies nicht der Fall ist. Dieser wird dann durch den Scope weitergegeben. Wenn eine Methode weiter unten einen neuen Span hinzuf\u00fcgen m\u00f6chte, nimmt sie den aktuellen activeSpan aus dem Scope, erstellt einen neuen Span, erkl\u00e4rt, dass der erhaltene activeSpan der \u00fcbergeordnete ist, und macht den neuen Span aktiv. Bei Aufrufen externer Dienste wird der aktuelle aktive Span \u00fcbergeben, und diese Dienste erstellen neue Spans in Verbindung mit diesem Span.<br \/>\nDie gesamte Arbeit erfolgt \u00fcber das Tracer-Instanz. Sie kann \u00fcber den DI-Mechanismus oder GlobalTracer.get() als globale Variable abgerufen werden, falls der DI-Mechanismus nicht funktioniert. Standardm\u00e4\u00dfig wird, wenn der Tracer nicht initialisiert wurde, ein NoopTracer zur\u00fcckgegeben, der keine Funktion hat.<br \/>\nVon dem Tracer wird dann \u00fcber den ScopeManager der aktuelle Scope abgerufen. Ein neuer Scope wird basierend auf dem aktuellen erstellt, der an einen neuen Span gebunden ist. Anschlie\u00dfend wird der erstellte Scope geschlossen, wodurch der span beendet wird und der vorherige Scope wieder aktiv wird. Da der Scope an den Thread gebunden ist, muss beim Multithreading ber\u00fccksichtigt werden, dass der aktive Span in einen anderen Thread \u00fcbergeben wird, 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 erledigen.\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: reaktiviere den Span im Callback, beginne aktiv zu sein, wenn 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 Multi-Thread-Programmierung gibt es auch TracedExecutorService und \u00e4hnliche Wrapper, die den aktuellen Span beim Start von asynchronen Aufgaben automatisch in den Thread durchreichen:<\/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>Herausforderungen, mit denen wir konfrontiert sind<\/h3>\n<p><\/p>\n<ul>\n<li>Beans und DI funktionieren nicht immer, wenn der Tracer nicht in einem Dienst 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 es muss GlobalTracer.get() verwendet werden.<\/li>\n<li>Annotations funktionieren nicht, wenn es sich nicht um eine Komponente oder einen Dienst handelt, oder wenn der Methodenaufruf aus einer benachbarten Methode derselben Klasse erfolgt. Man muss vorsichtig sein, \u00fcberpr\u00fcfen, was funktioniert, und die manuelle Erstellung des Traces verwenden, wenn @Traced nicht funktioniert. Zus\u00e4tzlich kann ein Compiler f\u00fcr Java-Annotationen integriert werden, dann sollten sie \u00fcberall funktionieren.<\/li>\n<li>In \u00e4lteren Spring- und Spring-Boot-Versionen funktioniert die Autokonfiguration von OpenTracing mit Spring Cloud nicht aufgrund von Bugs in der DI. Wenn man m\u00f6chte, dass die Traces in den Spring-Komponenten automatisch funktionieren, kann man dies analog zu machen wie in <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 mit Ressourcen nicht, man muss unbedingt try finally verwenden.<\/li>\n<li>Jeder Dienst muss seinen eigenen spring.application.name angeben, unter dem die Traces protokolliert werden. Zudem sollte ein separater Name f\u00fcr die Produktion und den Test verwendet werden, um diese nicht zu vermischen.<\/li>\n<li>Wenn GlobalTracer und Tomcat verwendet werden, haben alle im Tomcat laufenden Dienste denselben GlobalTracer. Daher wird f\u00fcr alle derselbe Dienstname verwendet.<\/li>\n<li>Beim Hinzuf\u00fcgen von Traces zu einer Methode sollte sichergestellt werden, dass diese nicht mehrmals in einer Schleife aufgerufen wird. Es ist besser, einen gemeinsamen Trace f\u00fcr alle Aufrufe hinzuzuf\u00fcgen, der die gesamte Ausf\u00fchrungszeit protokolliert. Andernfalls wird eine \u00fcberm\u00e4\u00dfige Last erzeugt.<\/li>\n<li>Einmal haben wir im jaeger-ui zu gro\u00dfe Anfragen f\u00fcr eine gro\u00dfe Anzahl von Traces gemacht und, da wir auf die Antwort nicht gewartet haben, haben wir es erneut gemacht. Infolgedessen begann jaeger-query viel Speicher zu verbrauchen und verlangsamte Elasticsearch. Ein Neustart von jaeger-query hat geholfen.<\/li>\n<\/ul>\n<h3>Sampling, Speicherung und Ansicht von Traces<\/h3>\n<p>\nEs gibt drei Arten <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.9\/sampling\/\">des Trace-Samplings<\/a><\/noindex>:<\/p>\n<ol>\n<li>Const, das alle Traces sendet und speichert.<\/li>\n<li>Probabilistisch, das Traces mit einer bestimmten Wahrscheinlichkeit filtert.<\/li>\n<li>Rate-Limiting, das die Anzahl der Traces pro Sekunde begrenzt. Diese Parameter k\u00f6nnen entweder am Client, am jaeger-agent oder im Collector konfiguriert werden. Derzeit verwenden wir im Validator-Stack den Const-Wert 1, da die Anfragen nicht sehr zahlreich sind, aber sie viel Zeit in Anspruch nehmen. K\u00f6nnte dies k\u00fcnftig zu einer \u00fcberm\u00e4\u00dfigen Belastung des Systems f\u00fchren, k\u00f6nnen wir eine Begrenzung einrichten.<\/li>\n<\/ol>\n<p>\nWenn Cassandra verwendet wird, speichert sie standardm\u00e4\u00dfig Traces nur f\u00fcr zwei Tage. Wir verwenden <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger\/tree\/master\/plugin\/storage\/es\">elasticsearch<\/a><\/noindex> Die Traces werden zeitlich unbegrenzt gespeichert und nicht gel\u00f6scht. F\u00fcr jeden Tag wird ein separater Index erstellt, zum Beispiel jaeger-service-2019-03-04. Zuk\u00fcnftig sollte eine automatische Bereinigung alter Traces eingerichtet werden.<\/p>\n<p>Um die Traces anzuzeigen, m\u00fcssen Sie:<\/p>\n<ul>\n<li>Einen Service ausw\u00e4hlen, nach dem Sie die Traces filtern m\u00f6chten, zum Beispiel tomcat7-default f\u00fcr den Service, der in Tomcat l\u00e4uft und keinen eigenen Namen haben kann.<\/li>\n<li>Anschlie\u00dfend einen Vorgang, einen Zeitrahmen und eine Mindestlaufzeit w\u00e4hlen, zum Beispiel von 10 Sekunden, um nur die langwierigen Ausf\u00fchrungen zu erfassen.<br \/>\n<img decoding=\"async\" alt=\"Service-Tracing, 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 \u00fcberpr\u00fcfen, was dort blockiert hat.<br \/>\n<img decoding=\"async\" alt=\"Service-Tracing, OpenTracing und Jaeger\" src=\"\/wp-content\/uploads\/2019\/04\/16e9dd11903358f5498fe11034bbf848.png\" style=\"display:block;margin: 0 auto;\" \/><\/li>\n<\/ul>\n<p>\nWenn eine Anfrage-ID bekannt ist, kann der Trace \u00fcber die Tagsuche mit dieser ID gefunden werden, vorausgesetzt, diese ID wird im Span des Traces protokolliert.<\/p>\n<h3>Dokumentation<\/h3>\n<p><\/p>\n<ul>\n<li>Dokumentation zu 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 zu Jaeger <noindex><a rel=\"nofollow\" href=\"https:\/\/www.jaegertracing.io\/docs\/1.10\/\">www.jaegertracing.io\/docs\/1.10<\/a><\/noindex><\/li>\n<li>Integration von Jaeger f\u00fcr Java <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/jaegertracing\/jaeger-client-java\">github.com\/jaegertracing\/jaeger-client-java<\/a><\/noindex><\/li>\n<li>Integration von Spring OpenTracing<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 ausf\u00fchren<\/li>\n<\/ul>\n<h3>Video<\/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 eingesetzt haben, um blitzschnelle Benutzeranfragen zu liefern \u2014 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> Einf\u00fchrung: Jaeger \u2014 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, \"Eine kleine Geschichte eines gro\u00dfen Sieges: OpenTracing, AWS und Jaeger\"<\/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 4.9.10 - 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 \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\" \/>\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) 4.9.10\" \/>\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 \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\" \/>\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 nutzen wir eine Mikrodienstarchitektur. Wenn es zu Engp\u00e4ssen bei der Leistung kommt, wird viel Zeit mit dem Monitoring und der Analyse von Logs verbracht. Bei der Protokollierung von Zeitmessungen einzelner Operationen in eine Logdatei ist es oft schwierig zu verstehen, was diesen Operationen zugrunde liegt, die Abfolge von Aktionen nachzuvollziehen oder die zeitliche Verschiebung einer Operation im Verh\u00e4ltnis zu einer anderen in verschiedenen Diensten zu verfolgen. Um dies zu minimieren,","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 \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","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"},"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}]}}