Tema ini menjelaskan fitur Analisis Tracing dalam lingkungan runtime Node.js.
Latar Belakang
Analisis Tracing Alibaba Cloud mengadopsi standar OpenTracing dan kompatibel dengan komunitas sumber terbuka. Fitur ini membantu pengembang aplikasi terdistribusi untuk menanyakan dan mendiagnosis jejak terdistribusi, menemukan topologi terdistribusi secara dinamis, serta merangkum kinerja aplikasi secara real-time.
Function Compute terintegrasi dengan Analisis Tracing. Anda dapat menggunakan Jaeger SDK atau OpenTelemetry untuk mengunggah informasi jejak sehingga dapat melacak pemanggilan fungsi. Analisis Tracing membantu menganalisis dan mendiagnosis hambatan kinerja dalam arsitektur serverless, meningkatkan efisiensi pengembangan dan diagnosis dalam skenario serverless.
Ikhtisar
Anda dapat mengonfigurasi Analisis Tracing di konsol Function Compute. Untuk informasi lebih lanjut, lihat Aktifkan Analisis Tracing.
Setelah mengaktifkan Analisis Tracing untuk layanan, Function Compute secara otomatis mencatat waktu yang dikonsumsi dalam sistem, termasuk waktu cold start, waktu eksekusi fungsi inisialisasi, dan waktu eksekusi fungsi. Untuk detail tentang rentang sistem pada gambar berikut, lihat Deskripsi nama rentang. 
Anda juga dapat mencatat waktu yang dikonsumsi untuk fungsi di sisi bisnis. Sebagai contoh, Anda dapat mencatat waktu yang diperlukan untuk mengakses layanan seperti ApsaraDB RDS dan File Storage NAS dalam fungsi dengan menggunakan Buat rentang kustom.
Contoh kode
Analisis Tracing untuk Function Compute dalam lingkungan runtime Node.js memungkinkan Anda membuat rentang kustom menggunakan metode berikut berdasarkan implementasi Jaeger dari spesifikasi OpenTracing.
Gunakan SDK untuk OpenTelemetry (direkomendasikan)
Dalam kode Node.js, Anda dapat menggunakan SDK untuk OpenTelemetry untuk melakukan instrumentasi kode dan melaporkan data ke Analisis Tracing. Untuk kode contoh lengkap, lihat nodejs-tracing-openTelemetry.
- Konfigurasikan file dependensi package.json di direktori proyek.
"dependencies": { "@opentelemetry/api": "^1.0.2", "@opentelemetry/exporter-jaeger": "0.25.0", "@opentelemetry/exporter-zipkin": "0.25.0", "@opentelemetry/instrumentation": "0.25.0", "@opentelemetry/instrumentation-http": "0.25.0", "@opentelemetry/resources": "0.25.0", "@opentelemetry/semantic-conventions": "0.25.0", "@opentelemetry/sdk-trace-node": "0.25.0", "@opentelemetry/sdk-trace-base": "0.25.0" } - Laporkan data ke Analisis Tracing.
module.exports.handler = function(event, context, callback) { tracer = require('./tracer')('fc-tracer',context.tracing.jaegerEndpoint); var spanContext = contextFromString( context.tracing.openTracingSpanContext); startMySpan(spanContext); callback(null,'success'); } - Buat objek
traceryang digunakan untuk membuat rentang.module.exports = (serviceName,endpoint) => { const provider = new NodeTracerProvider({ resource: new Resource({ [SemanticResourceAttributes.SERVICE_NAME]: serviceName, }), }); let exporter = new JaegerExporter({endpoint:endpoint}); provider.addSpanProcessor(new SimpleSpanProcessor(exporter)); provider.register(); registerInstrumentations({ instrumentations: [ new HttpInstrumentation(), ], }); return opentelemetry.trace.getTracer('http-example'); }; - Peroleh informasi tracing dari Context di Function Compute dan konversikan informasi tracing menjadi SpanContext.
function contextFromString(value){ const arr = value.split(`:`); const spanContext={ traceId:`0000000000000000`+arr[0], spanId:arr[1], traceFlags:api.TraceFlags.SAMPLED, isRemote:true } return spanContext; } - Buat
tracerdan gunakan konteks yang telah dikonversi untuk membuat rentang anak. Rentang mewakili potongan kode yang dapat dieksekusi secara terus-menerus yang diberi nama dan waktu dalam jejak pemanggilan. Anda juga dapat membuat rentang anak berdasarkan rentang tersebut.function startMySpan(spanContext){ var FcSpan=api.trace.wrapSpanContext(spanContext); var ctx = api.trace.setSpan(api.ROOT_CONTEXT,FcSpan); tracer.startActiveSpan("fc-operation",undefined,ctx,parentSpan => { parentSpan.setAttribute("version","fc-v1"); sleep(150); child(); parentSpan.end() }) } function child(){ tracer.startActiveSpan("fc-operation-child",span =>{ sleep(100); span.addEvent("timeout"); span.end(); }) }
Gunakan SDK untuk Jaeger
Anda dapat menggunakan SDK untuk Jaeger untuk melakukan instrumentasi kode dan melaporkan data ke Analisis Tracing. Untuk kode contoh lengkap, lihat nodejs-tracing.
- Konfigurasikan file dependensi package.json di direktori proyek.
"dependencies": { "jaeger-client": "^3.19.0" } - Laporkan data ke Analisis Tracing.
module.exports.handler = function(event, context, callback) { tracer=newTracer(context); var invokeSpanContext = spanContext.fromString(context.tracing.openTracingSpanContext); startMySpan(invokeSpanContext); callback(null,'success') } - Buat objek
tracerberdasarkan informasi tracing dalam Context.function newTracer(context){ var config = { serviceName: 'fc-tracer', reporter: { // Berikan titik akhir jejak; ini memaksa klien untuk terhubung langsung ke Collector dan mengirim rentang melalui HTTP collectorEndpoint: context.tracing.jaegerEndpoint, flushIntervalMs: 10, }, sampler: { type: "const", param: 1 }, }; var options = { tags: { 'version': 'fc-v1', }, }; var tracer = initTracer(config, options); return tracer } - Konversikan SpanContext dan buat rentang kustom. Anda juga dapat membuat rentang anak berdasarkan rentang tersebut.
function startMySpan(spanContext){ var parentSpan = tracer.startSpan("fc-operation", { childOf: spanContext }); sleep(150); child(parentSpan.context()) parentSpan.finish(); } function child(spanContext){ var childSpan = tracer.startSpan("fc-operation-child", { childOf: spanContext }); childSpan.log({event:"timeout"}); sleep(100); childSpan.finish(); }