Load Generator
আপনি এই পৃষ্ঠার ইংরেজি সংস্করণ দেখছেন কারণ এটি এখনও সম্পূর্ণভাবে অনুবাদ করা হয়নি। সাহায্য করতে আগ্রহী? দেখুন Contributing।
The load generator is based on k6, a Go load testing tool that
runs test scenarios written in JavaScript. By default it will simulate users
requesting several different routes from the frontend. All of its OpenTelemetry
instrumentation comes from the Go SDK, embedded in the k6 binary by the
xk6-otel extension described below.
Traces
Initializing Tracing
Tracing in the load generator is provided by a custom
xk6 extension (xk6-otel) that wraps the
OpenTelemetry Go SDK and exposes it to k6 JavaScript scripts. The extension is
compiled into the k6 binary at image build time.
The extension initializes a TracerProvider backed by an OTLP HTTP exporter on
first use. The collector endpoint, protocol, resource attributes, and service
name are read from the standard
OpenTelemetry environment variables
(OTEL_EXPORTER_OTLP_ENDPOINT, OTEL_EXPORTER_OTLP_PROTOCOL,
OTEL_RESOURCE_ATTRIBUTES, and OTEL_SERVICE_NAME).
Creating Spans
Scripts import the Tracer class from the k6/x/otel module and create spans
manually around each simulated user action:
import { Tracer } from 'k6/x/otel';
const tracer = new Tracer();
function browseProduct() {
const span = tracer.startSpan('user_browse_product', {
'product.id': product,
});
http.get(`${BASE_URL}/api/products/${product}`, {
headers: otelHeaders(span.traceParent()),
});
span.end();
}
The startSpan(name, attrs?) method starts a new client span and returns an
object with three methods:
traceParent()— returns the W3Ctraceparentheader value for the span, used to propagate trace context to backend services.log(message)— emits a correlated OTel log record tied to the span’s trace and span IDs.end()— ends the span and flushes it to the exporter.
Metrics
The load generator emits two kinds of metrics:
- k6 built-in test metrics (request duration, error rate, throughput, etc.)
are exported to the OpenTelemetry Collector via k6’s built-in
opentelemetryoutput (--out opentelemetry). The output protocol and collector endpoint are configured via theK6_OTEL_EXPORTER_PROTOCOLandK6_OTEL_HTTP_EXPORTER_ENDPOINTenvironment variables. - Go runtime metrics (memory, garbage collection, goroutines) are emitted by
the
xk6-otelextension using the OpenTelemetryruntimeinstrumentation.
Logs
Log records are emitted by calling span.log(message) on any active span. The
xk6-otel extension injects the span’s trace and span IDs into each log record.
Baggage
OpenTelemetry Baggage is used by the load generator to indicate that traces are
synthetically generated. Each outgoing HTTP request carries a baggage header
and a traceparent header constructed by the otelHeaders helper:
function otelHeaders(traceParent, extra) {
return Object.assign(
{
baggage: `synthetic_request=true,session.id=${sessionId}`,
traceparent: traceParent,
},
extra,
);
}
Baggage on its own doesn’t mark the telemetry. Each backend service reads the
synthetic_request entry out of the incoming baggage and copies it onto its own
spans and log records as an attribute, and it is that attribute which records
whether the telemetry came from a synthetic flow. The frontend sets
demo.synthetic_request, while the checkout and payment services set
user_agent.synthetic.type to test. Because the marker ends up on the
telemetry itself, you can filter load-generator traffic in or out of any query
in your observability backend.
মূল্যায়ন
এই পৃষ্ঠাটি কি সহায়ক ছিল?
Thank you. Your feedback is appreciated!
Please let us know how we can improve this page. Your feedback is appreciated!