Memancarkan Pelacakan Kode Pengguna
Selain mengaktifkan pelacakan dalam konfigurasi untuk mengumpulkan data instrumentasi yang dihasilkan oleh Windows Communication Foundation (WCF), Anda juga dapat memancarkan jejak secara terprogram dalam kode pengguna. Dengan cara ini, Anda dapat secara proaktif membuat data instrumentasi yang dapat Anda pergunakan nanti untuk tujuan diagnostik. Topik ini membahas bagaimana Anda dapat melakukan ini.
Selain itu, sampel Extending Tracing menyertakan semua kode yang ditunjukkan di bagian berikut.
Membuat Sumber Pelacakan
Anda dapat menggunakan kode berikut untuk membuat sumber pelacakan pengguna.
TraceSource ts = new TraceSource("myUserTraceSource");
Membuat Aktivitas
Aktivitas adalah unit pemrosesan logis. Anda dapat membuat satu aktivitas untuk setiap unit pemrosesan utama tempat Anda ingin jejak dikelompokkan bersama. Misalnya, Anda dapat membuat satu aktivitas untuk setiap permintaan ke layanan. Lakukan langkah-langkah berikut.
Simpan ID aktivitas dalam cakupan.
Buat ID aktivitas baru.
Transfer dari aktivitas dalam cakupan ke yang baru, atur aktivitas baru dalam cakupan dan keluarkan jejak awal untuk aktivitas tersebut.
Cuplikan kode berikut menunjukkan cara melakukannya.
Guid oldID = Trace.CorrelationManager.ActivityId;
Guid traceID = Guid.NewGuid();
ts.TraceTransfer(0, "transfer", traceID);
Trace.CorrelationManager.ActivityId = traceID; // Trace is static
ts.TraceEvent(TraceEventType.Start, 0, "Add request");
Memancarkan Jejak dalam Aktivitas Pengguna
Kode berikut memancarkan jejak dalam aktivitas pengguna.
double value1 = 100.00D;
double value2 = 15.99D;
ts.TraceInformation("Client sends message to Add " + value1 + ", " + value2);
double result = client.Add(value1, value2);
ts.TraceInformation("Client receives Add response '" + result + "'");
Menghentikan Aktivitas
Untuk menghentikan aktivitas, transfer kembali ke aktivitas lama, hentikan id aktivitas saat ini, dan reset id aktivitas lama dalam cakupan.
Cuplikan kode berikut menunjukkan cara melakukannya.
ts.TraceTransfer(0, "transfer", oldID);
ts.TraceEvent(TraceEventType.Stop, 0, "Add request");
Trace.CorrelationManager.ActivityId = oldID;
Menyebarkan ID Aktivitas ke Layanan
Jika Anda mengatur propagateActivity
atribut ke true
untuk System.ServiceModel
sumber pelacakan dalam file konfigurasi klien dan layanan, pemrosesan layanan untuk permintaan Tambahkan terjadi dalam aktivitas yang sama dengan yang ditentukan dalam klien. Jika layanan menentukan aktivitas dan transfernya sendiri, jejak layanan tidak muncul dalam aktivitas yang disebarkan klien. Sebaliknya, mereka muncul dalam aktivitas yang berkorelasi dengan mentransfer jejak ke aktivitas yang ID-nya disebarluaskan oleh klien.
Catatan
propagateActivity
Jika atribut diatur ke true
pada klien dan layanan, aktivitas sekitar dalam cakupan operasi layanan diatur oleh WCF.
Anda dapat menggunakan kode berikut untuk memeriksa apakah aktivitas diatur dalam cakupan oleh WCF.
// Check if an activity was set in scope by WCF, if it was
// propagated from the client. If not, ( ambient activity is
// equal to Guid.Empty), create a new one.
if(Trace.CorrelationManager.ActivityId == Guid.Empty)
{
Guid newGuid = Guid.NewGuid();
Trace.CorrelationManager.ActivityId = newGuid;
}
// Emit your Start trace.
ts.TraceEvent(TraceEventType.Start, 0, "Add Activity");
// Emit the processing traces for that request.
serviceTs.TraceInformation("Service receives Add "
+ n1 + ", " + n2);
// double result = n1 + n2;
serviceTs.TraceInformation("Service sends Add result" + result);
// Emit the Stop trace and exit the method scope.
ts.TraceEvent(TraceEventType.Stop, 0, "Add Activity");
// return result;
Melacak Pengecualian yang Dilemparkan dalam Kode
Saat Anda melemparkan pengecualian dalam kode, Anda juga dapat melacak pengecualian di tingkat Peringatan atau naik menggunakan kode berikut.
ts.TraceEvent(TraceEventType.Warning, 0, "Throwing exception " + "exceptionMessage");
Melihat Jejak Pengguna di Alat Penampil Pelacakan Layanan
Bagian ini berisi cuplikan layar jejak yang dihasilkan dengan menjalankan sampel Extending Tracing, saat dilihat menggunakan Alat Penampil Jejak Layanan (SvcTraceViewer.exe).
Dalam diagram berikut, aktivitas "Tambahkan permintaan" yang dibuat sebelumnya dipilih di panel kiri. Ini tercantum dengan tiga aktivitas operasi Matematika lainnya (Bagi, Kurangi, Kalikan) yang merupakan program klien aplikasi. Kode pengguna telah menentukan satu aktivitas baru untuk setiap operasi untuk mengisolasi potensi kemunculan kesalahan dalam permintaan yang berbeda.
Untuk menunjukkan penggunaan transfer dalam sampel Extending Tracing, aktivitas Kalkulator yang merangkum empat permintaan operasi juga dibuat. Untuk setiap permintaan, ada transfer bolak-balik dari aktivitas Kalkulator ke aktivitas permintaan (jejak disorot di panel kanan atas pada gambar).
Saat Anda memilih aktivitas di panel kiri, jejak yang disertakan oleh aktivitas ini ditampilkan di panel kanan atas. Jika propagateActivity
adalah true
di setiap titik akhir di jalur permintaan, jejak dalam aktivitas permintaan berasal dari semua proses yang berpartisipasi dalam permintaan. Dalam contoh ini, Anda dapat melihat jejak dari klien dan layanan di kolom ke-4 di panel.
Aktivitas ini menunjukkan urutan pemrosesan berikut:
Klien mengirim pesan ke Tambahkan.
Layanan menerima pesan Tambahkan permintaan.
Layanan mengirimkan Tambahkan respons.
Klien menerima Tambahkan respons.
Semua jejak ini dipancarkan pada tingkat Informasi. Mengklik jejak di panel kanan atas menunjukkan detail jejak tersebut di panel kanan bawah.
Dalam diagram berikut, kita juga melihat mentransfer jejak dari dan ke aktivitas Kalkulator, serta dua pasang jejak Mulai dan Hentikan per aktivitas permintaan, satu untuk klien dan satu untuk layanan (satu untuk setiap sumber pelacakan).
Daftar aktivitas berdasarkan waktu pembuatan (panel kiri) dan aktivitas berlapisnya (panel kanan atas)
Jika kode layanan melempar pengecualian yang menyebabkan klien juga melempar (misalnya, ketika klien tidak mendapatkan respons terhadap permintaannya), peringatan layanan dan klien atau pesan kesalahan terjadi dalam aktivitas yang sama untuk korelasi langsung. Dalam gambar berikut, layanan melemparkan pengecualian yang menyatakan "Layanan menolak untuk memproses permintaan ini dalam kode pengguna." Klien juga melemparkan pengecualian yang menyatakan "Server tidak dapat memproses permintaan karena kesalahan internal."
Gambar berikut menunjukkan bahwa kesalahan di seluruh titik akhir untuk permintaan tertentu muncul dalam aktivitas yang sama jika id aktivitas permintaan disebarluaskan:
Mengklik dua kali aktivitas Kalikan di panel kiri menunjukkan grafik berikut, dengan jejak untuk aktivitas Kalikan untuk setiap proses yang terlibat. Kita dapat melihat peringatan pertama kali terjadi di layanan (pengecualian ditampilkan), yang diikuti dengan peringatan dan kesalahan pada klien karena permintaan tidak dapat diproses. Oleh karena itu, kita dapat menyiratkan hubungan kesalahan penyebab antara titik akhir dan memperoleh akar penyebab kesalahan.
Gambar berikut menunjukkan tampilan grafik korelasi kesalahan:
Untuk mendapatkan jejak sebelumnya, kami mengatur ActivityTracing
untuk sumber pelacakan pengguna dan propagateActivity=true
untuk System.ServiceModel
sumber pelacakan. Kami tidak mengatur ActivityTracing
sumber System.ServiceModel
pelacakan untuk mengaktifkan kode pengguna ke penyebaran aktivitas kode pengguna. (Ketika pelacakan aktivitas ServiceModel aktif, ID aktivitas yang ditentukan dalam klien tidak disebarluaskan ke kode pengguna layanan; Namun, transfer menghubungkan aktivitas kode pengguna klien dan layanan dengan aktivitas WCF perantara.)
Menentukan aktivitas dan menyebarkan ID aktivitas memungkinkan kami melakukan korelasi kesalahan langsung di seluruh titik akhir. Dengan cara ini, kita dapat menemukan akar penyebab kesalahan dengan lebih cepat.