απαιτήσεις: Στην αρχιτεκτονική μικροϋπηρεσιών, όταν αντιμετωπίζετε προβλήματα, είναι συχνά πολύ δύσκολο να αντιμετωπίσετε προβλήματα, χωρίς να γνωρίζετε εάν πρόκειται για εξαίρεση από την υπηρεσία, μπορεί η υπηρεσία να γράψει ένα σφάλμα ή να υπάρχει πρόβλημα με τις πληροφορίες που μεταδίδονται από την υπηρεσία που καλεί την υπηρεσία. Εάν μπορεί να καταγραφεί το πλαίσιο όλων των αιτημάτων, δηλαδή ο σύνδεσμος προς ολόκληρο το πλήρες αίτημα συναλλαγής, είναι σημαντικό να αντιμετωπιστεί και να αναλυθεί το πρόβλημα.
Αναθεώρηση:
Τα ίχνη στοίβας εξαιρέσεων είναι ιδανικά για εφαρμογές που στοχεύουν σε μία μόνο διεργασία, όπως ένα μονολιθικό σύστημα εφαρμογών. Αλλά από την άλλη πλευρά, για την αντιμετώπιση κατανεμημένων εφαρμογών, όπως οι αρχιτεκτονικές μικροϋπηρεσιών, τα ίχνη στοίβας δεν αρκούν για να δείξουν το συνολικό ίχνος μηνύματος. Αυτός είναι ο λόγος για τον οποίο τα κατανεμημένα εργαλεία και πρότυπα ιχνηλάτησης καθίστανται απαραίτητα. Το W3C ορίζει ένα πρότυπο για αυτόν τον τύπο ίχνους που ονομάζεται Trace Context.
Πρότυπο περιβάλλοντος ανίχνευσης
Τεκμηρίωση του W3C Trace Context:Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η προδιαγραφή W3C Trace Context ορίζει πρότυπα και μορφές για κεφαλίδες HTTP για τη διάδοση κατανεμημένων πληροφοριών περιβάλλοντος ανίχνευσης. Ορίζει 2 πεδία που χρησιμοποιούνται για τη μετάδοση της ροής ίχνους στην κεφαλίδα αίτησης HTTP. Ας ρίξουμε μια ματιά σε αυτά τα 2 πεδία στον τυπικό ορισμό:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
πεδίο traceparent
Η προδιαγραφή για το ιχνογενές πεδίο ορίζεται με τη μορφή του Extended Baccos Paradigm (ABNF) και αποτελείται από 4 μέρη:
Έκδοση - traceid - parentid/spanid - traceflags Για παράδειγμα:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Η τιμή είναι ακριβώς η ίδια στον ίδιο σύνδεσμο。
- parent-id/span-id: 8 byte για να εκφράσετε το γονικό του τρέχοντος εύρους σε ένα εισερχόμενο αίτημα ή ένα εξερχόμενο αίτημα.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Όλα τα πεδία κωδικοποιούνται σε δεκαεξαδικό, όπως φαίνεται στην παρακάτω εικόνα:
Κατανεμημένη ανίχνευση .NET
Η κατανεμημένη ανίχνευση είναι μια διαγνωστική τεχνική που βοηθά τους μηχανικούς να εντοπίσουν αστοχίες και ζητήματα απόδοσης σε εφαρμογές, ειδικά εκείνες που μπορεί να διανεμηθούν σε πολλούς υπολογιστές ή διαδικασίες. Αυτή η τεχνική συσχετίζει την εργασία που εκτελείται από διαφορετικά στοιχεία εφαρμογής μέσω της παρακολούθησης αιτημάτων στην εφαρμογή και τη διαχωρίζει από άλλες εργασίες που μπορεί να εκτελέσει η εφαρμογή κατά το χειρισμό ταυτόχρονων αιτήσεων. Για παράδειγμα, ένας εξισορροπητής φόρτου μπορεί πρώτα να λάβει μια αίτηση για μια τυπική υπηρεσία web, στη συνέχεια να την προωθήσει σε μια διεργασία διακομιστή web και, στη συνέχεια, να εκδώσει πολλά ερωτήματα στη βάση δεδομένων. Με την κατανεμημένη ανίχνευση, οι μηχανικοί μπορούν να διακρίνουν εάν αυτά τα βήματα απέτυχαν, πόσο χρόνο διαρκεί κάθε βήμα και ποια μηνύματα μπορεί να καταγράφονται όταν εκτελείται κάθε βήμα.
Στο .NET, η βιβλιοθήκη System.Diagnostics.Activity έχει ρυθμιστεί ώστε να χρησιμοποιεί το πρότυπο W3C. Η κεφαλίδα ιχνηλάτησης τύπου W3C Request-Id προστέθηκε στο ASP.NET Core 2.0. Για να την αλλάξετε σε κεφαλίδα traceparent που συμμορφώνεται με το περιβάλλον ανίχνευσης του W3C, ορίστε τη στατική ιδιότητα Activity.DefaultIdFormat σε W3C κατά την εκκίνηση του προγράμματος. Ο κωδικός έχει ως εξής:
διαδικασία δοκιμής,Πρόγραμμα περιήγησης -> Μια υπηρεσία (/http, το backend χρησιμοποιεί HttpClient για να ζητήσει την υπηρεσία Β) διεπαφή -> Διεπαφή υπηρεσίας Β (/test), η υπηρεσία Α εξάγει το δικό της περιβάλλον ανίχνευσης και το περιβάλλον ανίχνευσης της υπηρεσίας Β, ο κώδικας έχει ως εξής:
Ξεκινήστε τις υπηρεσίες Α και Β, όπως φαίνεται στην παρακάτω εικόνα:
Το πρόγραμμα περιήγησης ανοίγει την Υπηρεσία Α, όπως φαίνεται στην παρακάτω εικόνα:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Περιεχόμενο απάντησης:{"id":"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00","traceId":"9891603e6c4921598951f425d98e4df7","spanId":"8874f9b2f9c0702e","parentId": "00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00","traceFlags":"Κανένα","isSampled":false}
--------------------------------------------------
Name: HttpHandlerDiagnosticListener
DateTime: 2025/12/22 9:37:22
Id: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: e0336cc56a4f2150
ParentId: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
Key: System.Net.Http.HttpRequestOut.Stop, Value: { Response = StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{ Ημερομηνία: Mon, 22 Dec 2025 01:37:21 GMT Διακομιστής: Kestrel Μεταφορά-Κωδικοποίηση: τεμαχισμένη Σύνδεση: keep-alive Τύπος περιεχομένου: εφαρμογή/json; σύνολο χαρακτήρων=utf-8 }, Request = Μέθοδος: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Έκδοση: 1.1, Περιεχόμενο: <null>, Κεφαλίδες:
{ Ιχνηλάτηση: 00-9891603E6C4921598951F425D98E4DF7-E0336CC56A4F2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Χρησιμοποιώντας το εργαλείο σύλληψης πακέτων Charles Proxy, το αίτημα και η απάντηση είναι τα εξής:
Εάν θέλετε να απενεργοποιήσετε το HttpClient από το να περάσει το traceparent, οι μεταβλητές περιβάλλοντος ορίζονται ως εξής:
Αναφορά:
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή.
Η σύνδεση με υπερσύνδεσμο είναι ορατή. |